什么是状态管理?
理论上来说,每⼀个 Vue 组件实例都已经在“管理”它⾃⼰的响应式状态了。
它是⼀个独⽴的单元,由以下⼏个部分组成:
状态:驱动整个应⽤的数据源;
视图:对状态的⼀种声明式映射;
交互:状态根据⽤户在视图中的输⼊⽽作出相应变更的可能⽅式。
当我们有多个组件共享⼀个共同的状态时,就没有这么简单了:
⼀个可⾏的办法是将共享状态“提升”到共同的祖先组件上去,再通过 props 传递下来。然⽽在深 层次的组件树结构中这么做的话,很快就会使得代码变得繁琐冗⻓。
另⼀个更简单直接的解决⽅案是抽取出组件间的共享状态,放在⼀个全局单例中来管理。这样我们 的组件树就变成了⼀个⼤的“视图”,⽽任何位置上的组件都可以访问其中的状态或触发动作。
Store
Store (如 Pinia) 是⼀个保存状态和业务逻辑的实体,它并不与你的组件树绑定。换句话说,它承载着全 局状态。它有点像⼀个永远存在的组件,每个组件都可以读取和写⼊它。它有三个概念,state、getter 和 action,我们可以假设这些概念相当于组件中的 data、 computed 和 methods。
应该在什么时候使⽤ Store?
⼀个 Store 应该包含可以在整个应⽤中访问的数据。这包括在许多地⽅使⽤的数据,例如显示在 导航栏中的⽤户信息,以及需要通过⻚⾯保存的数据,例如⼀个⾮常复杂的多步骤表单。 另⼀⽅⾯,你应该避免在 Store 中引⼊那些原本可以在组件中保存的本地数据,例如,⼀个元素 在⻚⾯中的可⻅性。
并⾮所有的应⽤都需要访问全局状态,但如果你的应⽤确实需要⼀个全局状态,那 Pinia 将使你的 开发过程更轻松。
Getter 完全等同于 store 的 state 的计算值。可以通过 defineStore() 中的 getters 属性来定义它 们。推荐使⽤箭头函数,并且它将接收 state 作为第⼀个参数
Action 相当于vue组件中的 method。它们可以通过 defineStore() 中的 actions 属性来定义,并且 它们也是定义业务逻辑的完美选择。
为确保 pinia 实例被激活,最简单的⽅法就是将 useStore() 的调⽤放在 pinia 安 装后才会执⾏的 函数中。
vuex简介
作⽤:对 vue 应⽤中多个组件的共享状态进⾏集中式的管理(读/写)
使⽤步骤:
- 执⾏指令 npm i vuex -S 安装vuex
- 在项⽬src⽂件夹下新建store⽂件夹,⽂件夹内建index.js
- 在main.js中引⼊store下的index.js: import store from './store'
- 在vue的实例对象中使⽤store
- 在index.js中引⼊vue及vuex: import Vue from 'vue' import Vuex from 'vue x'
- 设置vue使⽤vuex Vue.use(Vuex)
内容: state:驱动应⽤的数据源(可以理解成data)
view:以声明⽅式将state映射到视图(可以理解成⾥⾯的内容)
actions:响应在view上的⽤户输⼊导致的状态变化(可以理解成methods)