Open LastPoem opened 5 years ago
Vuex的用途:专门用于状态管理。 因为在Vue中,状态即数据,状态管理实际上也就是数据管理。由于vue组件间数据传递较为困难且兄弟组件没有专门传递数据的方法,并且复杂应用中组件间传值变得更为复杂。此时可以使用vuex在多个组件间进行通信。
state是专门用于存放数据的对象。把需要在不同组件间传递的数据放在state里。 在组件中,使用this.$store.state.数据 来获取数据。
getters和vue中的computed类似,用于监听state里数据的变化。方便用state里存储的数据生成一些可以直接使用的数据。且只有state里的依赖值发生改变后getters里方法的返回值才会发送变化。 在组件中,使用this.$store.getters.处理方法 来获取处理后的数据
getters只是可以利用state里存储的数据生成一些经过处理的数据,但不会影响到state存储数据的本身。而mutations是唯一可以修改state所存储数据的对象。在mutations里定义方法,用来修改state里的数据。 在组件中。使用this.$store.commit(方法名,参数)使用mutations里的方法
类似于mutations,但是不同之处是:
官方不建议直接使用mutations来直接改变state里的数据,而是先提交actions,在actions里提交mutations来修改状态。 在组件中,使用this.$store.dispatch()使用actions里的方法 示例:
mutations:{ add(state){ // 修改state里的count state.count = state.count + 1; } } actions:{ addFun(context){ // 提交mutations里的add方法 context.commit("add") } } // 在组件中的调用: this.$store.dispatch("addFun")
包括mapState、mapGetters、mapActions 有时在组件中需要多次调用this.$stroe.state.数据,this.$store.dispatch(),这时可以现在组件中导入辅助函数 import {mapState,mapGetters,mapActions} from "vuex"
import {mapState,mapGetters,mapActions} from "vuex"
Vuex 允许我们将 store 分割成大大小小的对象,每个对象也都拥有自己的 state、getter、mutation、action,这个对象我们把它叫做 module(模块),在模块中还可以继续嵌套子模块、子子模块 …… 比如说某个module专门用于管理用户登录数据,而另一个module用来管理各组件间通信以实现某个业务逻辑。
用法示例: 在modules文件夹下新建两个文件:moduleA.js 和 moduleB.js
// moduleA的示例 export default { state: { text: 'moduleA' }, getters: {}, mutations: {}, actions: {} }
然后在store.js中,导入moduleA和B
import moduleA from './module/moduleA'; import moduleB from './module/moduleB'; export default new Vuex.Store({ modules: { moduleA, moduleB, }, // ... }
在组件中就可以使用this.$store.state.moduleA.text来访问moduleA里state的数据text。(即需要通过模块名访问不同模块里的数据) 注意问题: 模块内部的 action、mutation 和 getter 默认可是注册在全局命名空间的,这样使得多个模块能够对同一 mutation 或 action 作出响应。 解决方法:通过添加 namespaced: true 的方式使其成为带命名空间的模块。比如在 moduleA.js 中添加 namespaced: true。
如何在模块中访问 store 根节点的数据 state: 可以在模块内部的 getter 和 action 中,通过 rootState 这个参数来获取。 以下是moduleA文件示例:
export default { getters: { // 注意:rootState必须是第三个参数 detail(state, getters, rootState) { return state.text + '-' + rootState.name; } }, actions: { callAction({state, rootState}) { alert(state.text + '-' + rootState.name); } } }
Vuex的用途:专门用于状态管理。 因为在Vue中,状态即数据,状态管理实际上也就是数据管理。由于vue组件间数据传递较为困难且兄弟组件没有专门传递数据的方法,并且复杂应用中组件间传值变得更为复杂。此时可以使用vuex在多个组件间进行通信。
Vuex
1.state
state是专门用于存放数据的对象。把需要在不同组件间传递的数据放在state里。 在组件中,使用this.$store.state.数据 来获取数据。
2.getters
getters和vue中的computed类似,用于监听state里数据的变化。方便用state里存储的数据生成一些可以直接使用的数据。且只有state里的依赖值发生改变后getters里方法的返回值才会发送变化。 在组件中,使用this.$store.getters.处理方法 来获取处理后的数据
3.mutations
getters只是可以利用state里存储的数据生成一些经过处理的数据,但不会影响到state存储数据的本身。而mutations是唯一可以修改state所存储数据的对象。在mutations里定义方法,用来修改state里的数据。 在组件中。使用this.$store.commit(方法名,参数)使用mutations里的方法
4.actions
类似于mutations,但是不同之处是:
官方不建议直接使用mutations来直接改变state里的数据,而是先提交actions,在actions里提交mutations来修改状态。 在组件中,使用this.$store.dispatch()使用actions里的方法 示例:
5.辅助函数
包括mapState、mapGetters、mapActions 有时在组件中需要多次调用this.$stroe.state.数据,this.$store.dispatch(),这时可以现在组件中导入辅助函数
import {mapState,mapGetters,mapActions} from "vuex"
6.module
Vuex 允许我们将 store 分割成大大小小的对象,每个对象也都拥有自己的 state、getter、mutation、action,这个对象我们把它叫做 module(模块),在模块中还可以继续嵌套子模块、子子模块 …… 比如说某个module专门用于管理用户登录数据,而另一个module用来管理各组件间通信以实现某个业务逻辑。
用法示例: 在modules文件夹下新建两个文件:moduleA.js 和 moduleB.js
然后在store.js中,导入moduleA和B
在组件中就可以使用this.$store.state.moduleA.text来访问moduleA里state的数据text。(即需要通过模块名访问不同模块里的数据) 注意问题: 模块内部的 action、mutation 和 getter 默认可是注册在全局命名空间的,这样使得多个模块能够对同一 mutation 或 action 作出响应。 解决方法:通过添加 namespaced: true 的方式使其成为带命名空间的模块。比如在 moduleA.js 中添加 namespaced: true。
如何在模块中访问 store 根节点的数据 state: 可以在模块内部的 getter 和 action 中,通过 rootState 这个参数来获取。 以下是moduleA文件示例: