模块化vuex,获取、设置数据,及刷新保留数据方法

模块化vuex,获取、设置数据,及刷新保留数据方法,第1张

1.模块化vuex

2.获取vuex中的数据

3.设置vuex中的数据

4.刷新之后,保留数据

数据结构

index.js

transaction.js模块

注意:namespaced是为了解决不同模块命名冲突的问题,分两种情况来写

获取vuex中的数据

设置vuex中的数据

如果将namespaced设置为false,则需要注意命名不能重复

也可以使用mapState,mapGetters,mapActions

安装

修改index.js配置,将数据保存到sessionStorage

vuex是在每个组件上注入this. store获取共享的状态,定义 *** 作state的方法

首先使用vue.use(vuex)表明vuex是vue的插件,只能被vue使用——实例化Store并传入参入——Store注入到根组件上。以上三个步骤便可以使用vuex实现数据在组件中的共享了。

当使用到vue.use的时候,会调用Store文件中的install方法,并可以获取到当前组件的执行期上下文。通过全局混合的方式,在每个组件上嵌入this.$store属性。

当Store类被实例化时,会执行constructor构造器并且传入option所需的参数,在对state、getters、mutations、actions编写。

1、实现state:理论上讲,直接把参数中的state赋值当前组件上即可,这样会引发一个问题,state的值无法动态改变。要使用state双向绑定可以直接使用vue实例中data方法,然后在通过get进行属性的截取。

2、实现getters:通过Ojbect.defineProperty监听getters值里面的变化,当获取值的时候,会触发get方法,返回并执行参数getters里面的方法。

3、实现mutations:把参数mutations里面的方法重新用一个变量去接收,作用是防止变量的全局污染。定义commit函数,当被执行时,触发定义mutaion对象里面的方法。

4、实现actions:方法同上,有个地方需要作出微调,传递的参数是当前的执行期上下文。

项目案例

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

如果一份数据需要在多个组件中使用,组件间传值又比较复杂,就可以使用vuex托管数据。

state选项: 定义状态(状态就是数据)。

mutations选项: 定义修改状态的方法(注意:这里面只能定义同步方法)。

$store: 返回的是当前项目中的全局状态对象。

commit()方法: 用于执行指定的mutations里面的方法。

在组件中,直接通过$store.state就可以获取到全局状态对象管理的状态数据,直接渲染到页面。

state选项: 定义状态(状态就是数据)。

通过 $store.state.数据名 使用。

getters选项: 定义计算属性。方法的参数是状态对象。

通过 $store.getters.属性名 使用计算属性。

mutations选项: 定义修改状态的方法(注意:这里的方法一般都是同步方法)。方法的第一个参数是状态对象,第二个参数是新值。

通过 commit() 方法,调用mutations里面的方法。

actions选项: 定义 *** 作状态的方法(这里的方法可以定义异步方法)。

注意: actions里的方法最好不要直接 *** 作state状态,而是通过调用mutations里面的方法去修改状态。所以,actions直接 *** 作的是mutations。

通过 dispatch() 方法,调用actions里面定义的方法。

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块。

namespaced属性: 默认情况下,action、mutation 和 getter 是注册在全局命名空间的。通过设置namespaced属性为true,将action、mutation 和 getter全部注册到私有命名空间中。

要从私有模块中获取数据,方式是: $store.state.模块名称.模块的数据

要从私有模块中获取计算属性,方式是: $store.getters['模块名/计算属性']

调用私有模块里面的mutations定义的方法,方式是: $store.commit('模块名/方法名',新值)

调用私有模块里面的actions定义的方法,方式是: $store.dispatch('模块名/方法名',新值)

直接在模板中使用全局状态管理数据,表达式会写的很长。所以可以使用计算属性。

通过映射函数mapState、mapGetters、mapActions、mapMutations,可以将vuex.store中的属性映射到vue实例身上,这样在vue实例中就能访问vuex.store中的属性了,便于 *** 作vuex.store。

如果vuex里面state的数据名称 跟 页面中的计算属性名称相同,就可以使用 mapState 映射函数,自动生成页面中的计算属性。

如果vuex里面getters的数据名称 跟 页面中的计算属性名称相同,就可以使用 mapGetters 映射函数,自动生成页面中的计算属性。

注意: 如果要映射模块里面的state/getters,函数的第一个参数设置为模块的名称。

如果定义的方法名跟全局管理对象中mutations里面的方法名相同,并且定义的方法会带有一个参数,通过参数传递数据。满足该规则,就可以使用 mapMutations 映射函数生成方法。

如果定义的方法名跟全局管理对象中actions里面的方法名相同,并且定义的方法会带有一个参数,通过参数传递数据。满足该规则,就可以使用 mapActions 映射函数生成方法。

注意: 如果要映射私有模块中mutations/actions里面的方法,函数的第一个参数设置为模块的名称。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/8015378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存