10分钟学会vuex
Vuex全局的状态统一管理,解决组件之间状态共享和数据通信的问题。
第一步
store.js
第二步
main.js
import Vue from 'vue'import App from './App.vue'import router from './router'import store from './store'
Vue.config.productionTip = false
new Vue({ router, store, // 增加store属性,值是导出store的实例 render: h => h(App)}).$mount('#app')
通过上面两个步骤,每个组件中都有了$store
属性,就是我们创建的容器。里面有commit
,dispatch
,state
,getters
,actions
,mutations
,在每个组件中可以通过this.$store
打印出来看看。
开始使用
定义状态
export default new Vuex.Store({state: { count: 1 // state中定义响应式的数据 }})
使用状态:在store的state
中定义的状态count
,在组件中可以使用this.$store.state.count
获取。
定义mutations
在store的mutations
中添加对应的方法
export default new Vuex.Store({ state: { count: 1 // state中定义响应式的数据 }, mutations: { addTen (state, num) { state.count = state.count + num } }, actions: {
}})
提交mutations
组件中通过commit
提交mutations
去修改state
中的状态
this.$store.commit('addTen', 10)
定义actions
在store的actions
中添加对应的方法
export default new Vuex.Store({state: {count: 1 },mutations: { addTen (state, num) {// 第一个参数是状态,第二个是传入的参数 state.count = state.count + num } },actions: { minusTen ({commit}, num) {// 第一个参数是store实例,第二个是传入的参数 setTimeout(() => { commit('addTen', num) }, 1000) } }})
派发动作
组件中可以使用dispatch
派发一个动作,来触发actions
中的方法,actions
可以异步的提交mutations
去修改state
中的状态
this.$store.dispatch('minusTen', 10)
actions
主要是复用,封装代码,处理异步,请求接口等等,真正修改状态放到了mutations
中处理
定义getters
在store的getters
中添加对应的方法
export default new Vuex.Store({state: {count: 1,person: {name: '张三' } },getters: { getName (state) {// getters是同步的return state.person.name } }})
使用getters
this.$store.getters.getName
getters
定义的方法相当于计算属性,相当于定义在computed
一样,有缓存,依赖改变会重新计算。
组件代码演示
<template><div class="hello"><h1>{{ this.$store.state.count }}</h1><h1>{{ this.$store.getters.getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>
<script>export default {methods: { syncAdd () {this.$store.commit('addTen', 10) }, asyncAdd () {this.$store.dispatch('minusTen', 10) } }}</script>
简写
上面的写法都是在this.$store
中获取属性或方法进行操作。
this.$store.state.countthis.$store.getters.getNamethis.$store.commit('addTen', 10)this.$store.dispatch('minusTen', 10)
但是这些操作写起来比较繁琐,每次都要写this.$store
,为了简写,所以vuex提供了一些映射的方法,直接导入到组件中就可以使用了。
<template><div class="hello"><h1>{{ count }}</h1><h1>{{ getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>
<script>import {mapActions, mapState, mapMutations, mapGetters} from 'vuex'export default {computed: { ...mapState(['count']), ...mapGetters(['getName']) },methods: { syncAdd () {this.addTen(10) }, asyncAdd () {this.minusTen(10) }, ...mapActions(['minusTen']), ...mapMutations(['addTen']) }}</script>
有一点需要说明的是,使用扩展运算符,表示这些方法返回的都是对象,mapState
和mapGetters
需要定义在计算属性中,因为他们定义的数据是响应式的。而mapActions
和mapMutations
需要定义在methods中。
拆分模块
状态是可以分层的,当一个项目维护的状态太多,可以拆分成单独的模块,在定义store中有个modules
属性,里面可以定义单独的模块。
import Vue from 'vue'import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({modules: {'page1': {namespaced: true,state: {count: 1,person: {name: '张三' } },mutations: { addTen (state, num) { state.count = state.count + num } },actions: { minusTen ({commit}) { setTimeout(() => { commit('addTen', 10) }, 1000) } },getters: { getName (state) {return state.person.name } } } }})
在组件中这样用
<template><div class="hello"><h1>{{ count }}</h1><h1>{{ getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>
<script>import {mapActions, mapState, mapMutations, mapGetters} from 'vuex'export default {computed: { ...mapState('page1', ['count']), ...mapGetters('page1', ['getName']) },methods: { syncAdd () {this.addTen(10) }, asyncAdd () {this.minusTen(10) }, ...mapActions('page1', ['minusTen']), ...mapMutations('page1', ['addTen']) }}</script>
每个方法都传了两个参数,第一个参数指定命名空间,第二个参数是对应的属性,为了进一步简写,可以通过帮助函数指定命名空间,指定当前组件在使用的模块。
<template><div class="hello"><h1>{{ count }}</h1><h1>{{ getName }}</h1><button @click="syncAdd">同步加10</button><button @click="asyncAdd">异步加10</button></div></template>
<script>import { createNamespacedHelpers } from 'vuex'// 创建帮助函数指定命令空间let { mapActions, mapState, mapMutations, mapGetters } = createNamespacedHelpers('page1')
export default {computed: { ...mapState(['count']), ...mapGetters(['getName']) },methods: { syncAdd () {this.addTen(10) }, asyncAdd () {this.minusTen(10) }, ...mapActions(['minusTen']), ...mapMutations(['addTen']) }}</script>
不使用简写
this.$store.getters['page1/getName']this.$store.state.page1.countthis.$store.commit('page1/addTen', 10)this.$store.dispatch('page1/minusTen', 10)
推荐图书
10分钟学会vuex相关推荐
- UWP开发入门(十九)——10分钟学会在VS2015中使用Git
原文:UWP开发入门(十九)--10分钟学会在VS2015中使用Git 写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支 ...
- python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...
原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...
- 百度贴吧自动发帖_引流网赚之百度贴吧引流窍门:实操引流教程百度贴吧零成本自动顶帖+10分钟学会豆瓣顶帖引流...
引流网赚之百度贴吧窍门:实操引流教程<百度贴吧零成本自动顶帖>+<10分钟学会豆瓣顶帖引流> 关于百度贴吧的引流方式有很多,像常见的关键词排名引流,比如,百度贴吧引流效果好不好 ...
- NiosII软处理器快速入门- 10分钟学会NiosII(1)
http://hi.baidu.com/hieda/blog/item/7f69080e9efb80ce7bcbe13d.html Nios简单介绍: Nios II是一个用户可配置的通用RISC嵌入 ...
- 手机版python3h如何自制游戏_Python 飞机大战|10 分钟学会用 python 写游戏
Python 飞机大战|10 分钟学会用 python 写游戏 2018 年 python 语言大火, 这把火看趋势已然延续到了 2019 年! 除了在科学计算领域 python 有用武之地之外, 在 ...
- #今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能
#今日论文推荐#1小时学会走路,10分钟学会翻身,世界模型让新生机器狗掌握多项技能 人类宝宝在出生后的第1年里,就会逐渐掌握协调能力,学习坐.立.翻滚和爬行. 那么机器人呢? 机器人能完成多复杂的任务 ...
- 惠普服务器win10安装系统教程,惠普笔记本U盘装Win10系统图文教程 10分钟学会重装系统...
U盘装系统,是电脑爱好者"老生常谈"的一个话题,在"电脑百事网"能找到许多类似的教程文章,不过今天的教程与往期有些不一样,首先是制作启动U盘,选用了一些更安全的 ...
- 最完整的WordPress建站教程,新手10分钟学会建站
假如你是一个菜鸟,也能从0开始,10分钟学会搭建(wordpress,Dede,Discuz!..)网站. 网站=域名+空间和数据库+网站程序+模板 1准备材料 [域名] 网址就相当于家的住址,记住和 ...
- pulsar 容量_[Pulsar系列] 10分钟学会Pulsar消息系统概念
Apache Pulsar Pulsar是一个支持多租户的.高性能的服务与服务之间消息通讯的解决方案,最初由雅虎开发,现在由Apache软件基金会管理. Pulsar在Yahoo的生产环境运行了三年多 ...
最新文章
- 漫画:如何螺旋遍历二维数组?
- 微信客服系统开发SDK使用教程- 拉取当前微信个人号列表请求(立即)
- 老子今天不加班,程序员也需要自由
- C++直接初始化与复制初始化的区别深入解析
- Teams Bot开发系列:Activity和Turn
- k8s mysql数据同步_K8s——MySQL实现数据持久化
- x86异常处理与中断机制(3)中断处理过程
- LeetCode 第 26 场双周赛(363/1971,前18.4%)
- Linux下netstat常用,Linux netstat常用命令
- javascript 停止事件冒泡以及阻止默认事件冒泡
- 中小企业成败关键在于老板
- 微服务架构下,DLI的部署和运维有何奥秘?
- addeventlistener不支持ajax_好程序员web前端学习路线分享了解AJAX是什么
- oracle 调用java 类_oracle数据库PL SQL调用Java类程序代码
- 团队天梯赛L1-001
- shelve模块使用说明
- 方舟生存计划怎么删除服务器信息,方舟进化生存怎么删服务器存档
- 吉安市推行“区块链+电子证照+无证办理”模式
- 【ISO9126】软件质量模型的介绍(软件质量管理的六大特征和二十七个子特征)
- RabbitMQ下载与安装
热门文章
- “我们的边缘计算技术点,可能超前了业界一点”
- 腾讯或推动斗鱼虎牙合并;拼多多推出“百亿补贴节”;Electron 9.2.0 发布| 极客头条
- 国士无双:卖掉美国房子,回国创办姚班,他只为培养一流的程序员!
- 诽谤、窃密、禁令、和解:文远知行创始团队纠纷暂时完结
- 用 Python 手写机器学习最简单的 KNN 算法
- @程序员,计算机重启包治百“病”?
- AI 算法在 FPGA 芯片上还有这种操作?
- 今日头条或推“多闪”对垒微信;快播王欣马桶 MT 被封;高通拒为 iPhone 提供芯片 | 极客头条...
- 马化腾评 ofo 溃败原因;京东到家否认裁员;王兴质押全部摩拜股权 | 极客头条...
- 阿里云计算赶超 IBM;扎克伯格或遭逼宫;IntelliJ IDEA 新版支持 Java 11 | CSDN极客头条...