vuex快速入门
明灭_已关注赞赏支持
vuex快速入门
明灭_已关注
32019.03.22 16:02:01字数 1,046阅读 1,316
本文为课程 vuex深入浅出 的学习总结与记录;同时参照了vuex官方文档。
文中demo的代码可参考:我的码云
一、概念
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
不使用vuex的数据流:
image.png
使用vuex进行状态维护:
image.png
二、在项目中使用vuex
可以通过以下步骤引入vuex:
安装:npm install vuex --save
创建store目录,用来存放所有状态。大型项目的目录结构可能如下所示:
image.png
在此我们只创建一个store.js文件作为示例:
state中存放的是唯一数据源
importVuefrom'vue'importVuexfrom'vuex';Vue.use(Vuex)exportconststore=newVuex.Store({// 注意Store的S大写state:{data1:...,data2:......}})
在main.js中添加如下代码:
import{store}from'../store/index'newVue({...store,...})
三、核心概念介绍
原课程是以小demo的形式讲解vuex,在此依同样方法做以记录。
此demo有两个组件listOne.vue和listTwo.vue,App.vue为主组件。
最终效果和初始代码(省略样式)如下:
效果图
store.js:
importVuefrom'vue'importVuexfrom'vuex';Vue.use(Vuex)exportconststore=newVuex.Store({// 注意Store的S大写state:{productList:[{name:'goods 1',price:100},{name:'goods 2',price:200},{name:'goods 3',price:300},{name:'goods 3',price:400}]}})
App.vue:
listOne.vue:
list one 名称:{{product.name}}
价格:{{product.price}}
降价 异步降价
listTwo.vue:
list two 名称:{{product.name}}
价格:{{product.price}}
核心概念1:state
state是vuex的唯一数据源,是所有组件的公共data。中上述代码中,我们已经将两个组件的公共数据存入state。在组件中,使用this.$store.state.product获取state中的数据。
如果需要获取多个state,可使用...mapState辅助函数。如下:
import{mapState}from'vuex;
...
computed: {
...mapState([
'productList',
'...'])}
此时组件中修改如下:
核心概念2:getters
getters用于从state中派生出一些状态,例如对列表进行过滤等。可以将getters理解为计算属性computed,getter的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
getters接受state作为其第一个参数
这时我们可以在store.js中添加一个getter属性:saleProducts,用于将商品价格除以2。
// store.js:importVuefrom'vue'importVuexfrom'vuex';Vue.use(Vuex)exportconststore=newVuex.Store({state:{productList:[{name:'goods 1',price:100},{name:'goods 2',price:200},{name:'goods 3',price:300},{name:'goods 3',price:400}]},getters:{getSaledPrice:(state)=>{letsaleProduct=state.productList.map((item)=>{return{name:'**'+item.name+'**',price:item.price/2}})returnsaleProduct;}}})
将listOne.vue中的productList的值更换为this.$store.getters.getSaledPrice:
// listOne.vueexport default{data(){return{productList:this.$store.getters.getSaledPrice}}}
此时效果如下:(注意list one部分名称和价格的变动)
image.png
如果需要使用多个getters,可使用...mapGetters辅助函数。如下:
computed:{...mapGetters:(['getSaledPrice',... ])}
核心概念3:mutation
更改vuex的store中的状态的唯一方法是提交mutation。vuex中的mutation类似于事件:每个mutation都有一个字符串的事件类型和一个回调函数。这个回调函数就是我们实际进行状态更改的地方,并且它会接受state作为第一个参数(payload为第二个参数,也就是自定义参数)。
在此我们给store添加一个mutation属性reducePrice,用于将商品价格减少payload:
// store.jsmutations:{reducePrice:(state,payload)=>{returnstate.productList.forEach((product)=>{product.price-=payload;})}}
// listOne.vuemethods:{reducePrice(){this.$store.commit('reducePrice',4)}}
点击降价按钮,可以发现价格发生变化:
image.png
或使用mapMutations辅助对象:
// listOne.vue...降价 ...
核心概念4:action
action类似于mutation,不同之处在于:
action提交的是mutation,而不是直接变更状态。
action可以包含异步操作,而mutation不行。
actions中的回调函数的第一个参数是context, 是一个与store实例具有相同属性和方法的对象.
action通过store.dispatch方法触发,mutation通过store.commit方法提交。
在此我们添加一个action属性,用来进行异步降价操作(每隔2秒后改变价格)
// store.jsactions:{// 提交的是mutation,可以包含异步操作reducePriceAsync:(context,payload)=>{setTimeout(()=>{context.commit('reducePrice',payload);// reducePrice为上一步mutation中的属性},2000)}}
methods:{reducePriceAsync(){this.$store.dispatch('reducePriceAsync',2)},}
或使用mapActions辅助对象:
// listOne.js...异步降价 ...
核心概念5:module
由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。
image.png
18人点赞
vue
"小礼物走一走,来关注我"
赞赏支持还没有人赞赏,支持一下
明灭_有些鸟儿是笼子关不住的。
总资产26 (约2.40元)共写了2.1W字获得155个赞共19个粉丝
已关注
全部评论0只看作者
按时间倒序
按时间正序
被以下专题收入,发现更多相似内容
收入我的专题
前端之美-VueJsVUE
推荐阅读更多精彩内容
vuex状态管理 一
目录 - 1.什么是vuex? - 2.为什么要使用Vuex? - 3.vuex的核心概念?||如何在组件中去使用...
我跟你蒋阅读 1,313评论 2赞 44
11.vuex 探索之路
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应...
白水螺丝阅读 3,561评论 7赞 61
Vuex 状态管理工具
Vuex是什么? Vuex 是一个专为 Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件...
萧玄辞阅读 1,509评论 0赞 6
Vuex一篇文章总结
vuex 场景重现:一个用户在注册页面注册了手机号码,跳转到登录页面也想拿到这个手机号码,你可以通过vue的组件化...
sunny519111阅读 4,920评论 6赞 107
vuex 要点 -- 原创
vuex是一个状态管理模式,通过用户的actions触发事件,然后通过mutations去更改数据(你也可以说状态...
reng99阅读 946评论 3赞 3
广告
明灭_
已关注
总资产26 (约2.40元)
《原则》 | 瑞·达利欧
阅读 39
原生js实现红绿灯效果
阅读 119
推荐阅读
var 为什么会被 let 取代
阅读 8,529
Promise的特性及实现原理
阅读 3,087
记录Vue移动端项目开发
阅读 91
公司企业站Vue-CLI4开发环境搭建详解
阅读 165
关于原型那些事
阅读 19
广告
评论0
赞18