操作系统寒武纪 - 会让企业IT高兴吗?
730
2023-01-08
本文目录一览:
本小节我们会介绍数据管理工具 vuex 。包括什么是 Vuex、Vuex 的安装、以及如何创建和使用 Vuex 数据仓库。
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态vuex移动应用开发,并以相应的规则保证状态以一种可预测的方式发生变化。
让我们从一个简单的 Vue 计数应用开始:
实例演示
"运行案例" 可查看在线运行效果
这个状态自管理应用包含以下几个部分:
以下是一个表示 “单向数据流” 理念的简单示意:
但是vuex移动应用开发,当我们的应用遇到多个组件共享状态时vuex移动应用开发,单向数据流的简洁性很容易被破坏:
对于问题一,传参的方法对于多层嵌套的组件将会非常繁琐,并且对于兄弟组件间的状态传递无能为力。对于问题二,我们经常会采用父子组件直接引用或者通过事件来变更和同步状态的多份拷贝。以上的这些模式非常脆弱,通常会导致无法维护的代码。
因此,我们为什么不把组件的共享状态抽取出来,以一个全局单例模式管理呢vuex移动应用开发?在这种模式下,我们的组件树构成了一个巨大的 “视图”,不管在树的哪个位置,任何组件都能获取状态或者触发行为!
通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。
Vuex 可以帮助我们管理共享状态,并附带了更多的概念和框架。这需要对短期和长期效益进行衡量。
如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此 —— 如果您的应用够简单,您最好不要使用 Vuex。一个简单的 store 模式就足够您所需了。但是,如果您需要构建一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。
我们可以在官网 (vuex) 上直接- vuex 。 在 Vue 之后引入 vuex 会进行自动安装:
在一个模块化的打包系统中,您必须显式地通过 Vue.use() 来安装 Vuex:
当使用全局 script 标签引用 Vuex 时,不需要以上安装过程。
每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 (state)。Vuex 和单纯的全局对象有以下两点不同:
实例演示
"运行案例" 可查看在线运行效果
代码解释 在 JS 代码第 4-8 行,通过 new Vuex.Store ({…}) 创建数据仓库。 在 JS 代码第 12 行,我们可以通过 store.state.count 访问仓库中定义的数据。
本节,我们带大家学习了 vuex 的基本概念。主要知识点有以下几点:
最近在重温vue全家桶,再看一遍感觉记忆更深刻,所以专门记录一下(本文vuex版本为v3.x)。
Vuex是专为Vue.js开发的状态管理模式。它采用集中式存储,管理所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化(我的理解就是全局变量)。
state
对象类型,类似于实例的 data属性,存放数据
getters
对象类型,类似于实例的计算属性 computed
mutations
对象类型,类似于实例的 methods,但是不能处理异步方法
actions
对象类型,类似于实例的 methods,可以处理异步方法
modules
对象类型,当state内容比较多时,通过该属性分割成小模块,每个模块都拥有自己的 state、mutation、action、getter
存储在 state 中的数据和 Vue 实例中的 data 遵循相同的规则,必须是纯粹的对象。
getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,并且默认接受 state 作为其第一个参数,也可以接受其他 getter 作为第二个参数(如下例)
通过调用 this.$store.commit('xxx') ,调用 mutation 中的方法,更改 store 中的值
新建文件 mutation-types.js ,定义方法名的常量,并导出
在store中
在组件中
注意, Action 提交的是 mutation ,而不是直接变更状态,并且可以包含任意异步操作
或者
Action 接受一个与 store 实例具有相同方法和属性的 context 参数对象,因此你可以调用 context.commit 提交一个 mutation ,或者通过 context.state 和 context.getters 来获取 state 和 getters ,利用 ES6 的解构,可以简化写法。
在vuex中
在组件中使用 async / await 或者 then / catch 处理异步
当应用变得非常复杂时, store 对象就可能变得相当臃肿。这时候可以将 store 分割成模块,每个模块拥有自己的 state 、 mutation 、 action 、 getter 、甚至是嵌套子模块,从上至下进行同样方式的分割。
在store目录下新建 Modules 文件夹,在 Modules 文件夹中新建 modulesA.js , modulesB.js ,如下图
在modulesA.js中写上局部模块的 state 、 mutation 、 action 、 getter ,并导出
然后在 store 的 index.js 中引入,并丢进 modules 对象里
在组件中直接使用
在组件中使用 mapState 映射
在组件中直接使用
在组件中使用 mapState 映射
模块内部的 getter ,接受的参数 state 和 getters 是模块的局部状态对象,而根节点的状态会作为第三个参数 rootState 暴露出来
如果需要带参数
在组件中直接使用
在组件中使用 mapMutations 映射
模块内部的 mutations ,默认接受的第一个参数 state 是模块的局部状态对象
如果需要带参数
在组件中直接使用
在组件中使用 mapActions 映射
或者重命名
对于模块内部的 action ,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState
默认情况下,模块内部的 action 、 mutation 和 getter 是注册在全局命名空间的,这样使得多个模块能够对同一 mutation 或 action 作出响应。如果希望模块具有更高的封装度和复用性,可以通过给模块添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter 、 action 及 mutation 都会自动根据模块注册的路径调整命名。
先在模块 moduleB.js 中添加 namespaced: true
在 store 的 index.js 中
如果在组件中使用命名空间,需要带上空间名称, mapState , mapGetters , mapMutations , mapActions 用法一样。
如果你希望使用全局的 state 和 getter , rootState 和 rootGetters 会作为第三和第四参数传入 getter ,也会通过 context 对象的属性传入 action 。若需要在全局命名空间内分发 action 或提交 mutation ,将 { root: true } 作为第三参数传给 dispatch 或 commit 即可
在带命名空间的模块注册全局 action ,需要添加 root: true ,并将这个 action 的定义放在函数 handler 中,其中,handler的第一个参数 namespacedContext 就是 action 中的 Context 参数
如果看了觉得有帮助的,我是@ 鹏多多11997110103 ,欢迎 点赞 关注 评论;
END
往期文章
个人主页
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里面的方法,函数的第一个参数设置为模块的名称。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~