首页 > 其他分享 >Pinia - vue 的状态管理库

Pinia - vue 的状态管理库

时间:2024-04-05 14:12:31浏览次数:25  
标签:count 状态 vue const pinia state useCounterStore Pinia store

Pinia - vue 的状态管理库

1. 介绍

Pinia 是 Vue 的专属状态管理库,它允许你跨组件或页面共享状态。

2. 安装和注册Pinia

  • 安装pinia
yarn add pinia
  • 注册pinia
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'

const pinia = createPinia()
const app = createApp(App)

app.use(pinia)
app.mount('#app')

3. 使用pinia

  • 定义store
import { defineStore } from 'pinia'

export const useTodos = defineStore('todos', {
  // 类似于data
  state: () => ({
    todos: [],
  }),
  // 类似于computed计算属性
  getters: {
    finishedTodos(state) {
      return state.todos.filter((todo) => todo.isFinished)
    }
  },
  // 类似于vue2中的methods
  actions: {
    addTodo(text) {
      this.todos.push({ text })
    },
  },
})
  • 使用store中的数据和方法
<script setup>
import { useCounterStore } from '@/stores/counter'
// 可以在组件中的任意位置访问 `store` 变量 
const store = useCounterStore()
</script>

4. 定义store的方式

Store (如 Pinia) 是一个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全局状态。它有点像一个永远存在的组件,每个组件都可以读取和写入它。
一个 Store 应该包含可以在整个应用中访问的数据。另一方面,你应该避免在 Store 中引入那些原本可以在组件中保存的本地数据

  • Option Store
    state 是 store 的数据 (data),getters 是 store 的计算属性 (computed),而 actions 则是方法 (methods)。
export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  getters: {
    double: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++
    },
  },
})
  • Setup Store
    ref() 就是 state 属性, computed() 就是 getters, function() 就是 actions
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }

  return { count, doubleCount, increment }
});

5. 解构store

使用storeToRefs解构store中的数据,以保持其响应性

<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
// `name` 和 `doubleCount` 是响应式的 ref
// 同时通过插件添加的属性也会被提取为 ref
// 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性
const { name, doubleCount } = storeToRefs(store)
// 作为 action 的 increment 可以直接解构
const { increment } = store
</script>

6. 操作state

  • 访问state
    默认情况下,你可以通过 store 实例访问 state,直接对其进行读写。
const store = useStore()
store.count++
  • 重置state
const store = useStore()
store.$reset()
  • 变更state
store.$patch({
  count: store.count + 1,
  age: 120,
  name: 'DIO',
})

store.$patch((state) => {
  state.items.push({ name: 'shoes', quantity: 1 })
  state.hasChanged = true
})
  • 替换state
store.$state = { count: 24 }
store.$patch({ count: 24 })
// 替换整个应用的初始state
pinia.state.value = {}
  • 订阅state
<script setup>
const someStore = useSomeStore()
// 此订阅器即便在组件卸载之后仍会被保留
someStore.$subscribe(callback, { detached: true })
</script>

7. 定义与使用getters

Getter 完全等同于 store 的 state 的计算值。 它将接收 state 作为第一个参数, 或者通过this访问其他getter。

  • 定义getter
export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0,
  }),
  getters: {
    doubleCount: (state) => state.count * 2,
    doubleCountPlusOne() {
      return this.doubleCount + 1
    },
  },
});
  • 访问getter
<script setup>
import { useCounterStore } from './counterStore'

const store = useCounterStore()
</script>

<template>
  <p>Double count is {{ store.doubleCount }}</p>
</template>

8. 定义与使用actions

Action 相当于组件中的 method, 用来定义业务逻辑。action 也可通过this访问整个 store 实例, 并且可以是异步的。

export const useCounterStore = defineStore('main', {
  state: () => ({
    count: 0,
  }),
  actions: {
    increment() {
      this.count++
    },
    randomizeCounter() {
      this.count = Math.round(100 * Math.random())
    },
  },
})

标签:count,状态,vue,const,pinia,state,useCounterStore,Pinia,store
From: https://www.cnblogs.com/xiaodi-js/p/18115698

相关文章

  • axios 常见状态码
    '100':'Continue','101':'SwitchingProtocols','102':'Processing','103':'EarlyHints','200':'Ok','201':'Created&......
  • Vue在表格中展示通过和不通过状态
    表格状态列显示通过和不通过状态,通过状态是绿色,不通过状态是黄色。代码<template><div><el-tableref="filterTable":data="tableData"style="width:100%"><el-table-columnprop="date"......
  • 高校听课讲座预约座位系统uniapp+vue微信小程序
    讲座预约管理系统的用户是系统最根本使用者,按需要分析系统包括用户:学生、管理员。管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括学生信息管理和文章公告管理。讲座公告管理,添加讲座公告信息,给学生发布一些学校的公告内容,为学习提前做准备,管理员管理后点......
  • vue3创建项目实例
    在控制台输入vuecreate文件名(vue3_basis) 选择第三个,默认自行选择安装 选择Router和vuex  选择3.x->vue3全部的选择项如下图 全部选择完后,开始构建项目 ......
  • Vue3 Diff 之 patchKeyedChildren 动态示例
    在学习全网学习各路大神的关于Vue3Diff算法分析文章的时候,一定离不开关键方法patchKeyedChildren。patchKeyedChildren处理的场景比较多,大致有5个主要过程。如果你希望查看不同测试用例下,patchKeyedChildren具体的内部处理过程,可以尝试一下这个:《Vue3Diff之patchKey......
  • Java项目:基于Springboot+vue实现的医院住院管理系统设计与实现(源码+数据库+开题报告+
    一、项目简介本项目是一套基于Springboot+vue实现的医院住院管理系统设包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。项目都经过严格调试,eclipse或者idea确保可以运行!该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值......
  • Vue 如何快速上手
    目录1.Vue是什么(概念)1.1.Vue的两种使用方式1.2.优点1.3.缺点2.创建Vue实例,初始化渲染2.1.步骤(核心步骤4步)2.2.练习——创建一个Vue实例3.插值表达式{{ }}3.1.介绍3.2.作用3.3.语法3.4.注意点3.5.练习——插值表达式 4.Vue响应式特性4.......
  • django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug
    django渲染模板与vue的语法冲突解决Flask框架默认WSGI:Werkzeug Python来说,它有很多web框架,常见的有jango、Flask、Tornado、sanic等,比如Odoo、Superset都基于Flask框架进行开发的开源平台,具有强大的功能。在Linux下,默认使用的WSGIServer一般为Gunicorn,它是一个比较出名的We......
  • VUE3 使用资源路径加载
    1.使用场景有些情况下,我需要使用组件路径动态的方式加载组件。2.实现方法import{defineAsyncComponent}from'vue';/***根据view组件路径异步加载组件.*@param{String}view组件路径这个文件在views下.*@returns{*}*/AppUtil.loadComponent=function(v......
  • 『VUE』11. 操作数组的方法(详细图文注释)
    目录vue中操作数组的方法会修改原数组的会进行渲染更新不修改原数组的不会进行渲染更新push自动渲染concat赋值渲染总结欢迎关注『VUE』专栏,持续更新中欢迎关注『VUE』专栏,持续更新中vue中操作数组的方法vue中数组数据呈现在网页,只检测一开始用到的数......