Vuex 实践讲解
- state 用来数据共享数据存储
- mutation 用来注册改变数据状态
- getters 用来对共享数据进行过滤操作
- action 解决异步改变共享数据
这个四大特征就是核心,如何用怎么用
接下来还是按着我们约定的来
此时采用的演示方式还是用官方提供的vue-cli webpack版本
在src目录下我们创一个vuex文件夹,分别创建index.js
,mutations.js
,state.js
,getters.js
,actions.js
好处:
这样我们可对四种特性进行分文件,这样可以更加明确,清楚
我们分别把这四个特性放入index.js中进行store的实列化
再把实列化的store引入就是所谓的index.js文件夹引入到main.js中,也可以同时把store注册到每一个组件中
state如何用?
在页面中,title肯定是必备,那每个组件页面的title都肯定不一样,那我们如何去拿到title,title适合放在那里,根据每个页面切换,而改变title,这个牵扯的就是组件与组件中的通信
我们可以在state.js中先声明一数据值
export default{
title : "首页"
}
那我们如何在首页中拿到这个title值
那我们在mian.js中再加入new Vue,绑定title作用域的实例代码
我们在computed里进行数据监听,
此时我们就可以从store里拿到state.title
最后一步,我们在index.html中我们再进行{{title}}绑定
index.html
<title>{{title}}</title>
此时我们运行一下,打开dev-tools你会发现
title这个数据已经在全局被共享了
matutions如何使用
应用场景:
如果我们要改变顶层的共享数据,我们应该要用matutions来进行改变,如果你做公众号,后台一般会在连接的上给你一些参数,比方说sid,ck,tm,或者一些其它东西,你想把他存在state中,如果去做,那我们就通过matutions来进行注册事件,为了演示,我才这么做
注意:
对于vuex,我只推荐state状态存储只在一个页面中组件与组件这间的通信,不适合夸页在, 放一些状态
state.js
export default{
START_PARMA : {},
title : "首页"
}
START_PARMA用来存放我以上连接参数的数据,我们先前一定要定意好
mutations.js
export default{
getParam (state,Object) {
state.START_PARMA = Object
}
}
我们对改变state数据进行一个事件注册,第一个参数是拿到state对象,第二个是传入的参数
- getParam官方说是type,其实就是注册的事件名
- 可以是单个参数
- 如果是多个参数,我们则用对象放入,如果你写两个参数,会报错
export default {
name : 'advertisement',
created () {
const keyCode = sessionStorage.keyCode = getQueryString('keyCode')
const keyWord = sessionStorage.keyWord = keyCode.split("_")[0]
const hunterCode = sessionStorage.hunterCode = keyCode.split("_")[1]
const sid = sessionStorage.sid= getQueryString('sid')
const ck = sessionStorage.ck = getQueryString('ck')
const tm = sessionStorage.tm = getQueryString('tm')
this.$store.commit('getParam',{
keyCode,
keyWord,
hunterCode,
sid,
ck,
tm
})
}
}
我们自己创建一个视图,然后在created里进行截取参数,因为store是注册到每个组件中的,所以我们要用this.$store来访问,那commit就是一个触发器,第一个是type类形名,第二个参我们用对象的方式传入,里面用的是es6的语法
此时你会发现
此时的截取的状态放到了一个对象里,我们就可以使用了
getters如何使用
如果说getter就是对state里的数据进行一些过滤,改造等等
那比方说State里有一些这样的数据
state.js
people : [
{name : 'ziksang1',age:21},
{name : 'ziksang2',age:10},
{name : 'ziksang3',age:30},
{name : 'ziksang4',age:40},
{name : 'ziksang5',age:50},
{name : 'ziksang6',age:30},
{name : 'ziksang7',age:80}
]
如果我们定义这些数据,然后我们要从,这些数据中筛选出年纪大于30的人,再进行返回,我们就可以用到getter,这里的getter的意思就是对vuex顶层数据进行过滤,而不改动state里原本的数据
getters.js
export default{
changePeople: (state) =>{
return state.people.filter(item=>{
if(item.age>30){
return true
}
})
}
}
好我们如何应用呢,我们在组件中里只要写入
created () {
console.log(this.changePeople)
},
computed : {
changePeople () {
return this.$store.getters.changePeople
}
},
那我们可以打开命台看一下,看回的数据,
接下来你如何想对数据进行操作那就看你自己的了
action 如何使用?
action.是用来解决异步流程来改变state数据的,有想人说,那我直接在matution里面进行写进不就行了麻,那你可以试一下,因为matution是直接进行同步操作的
mutations.js
export default{
getParam (state,Object) {
setTimeout(()=>{
state.START_PARMA = Object
},1000)
}
}
还是拿上面例子,如果你在mutations里进行异步操作,你会发现没用,并不会起任何效果,那怎么办,只有通过action->mutations->states,这个流程进行操作
action.js
export default {
getParamSync (context,Object) {
setTimeout(()=>{
context.commit('getParam',Object)
},3000)
}
}
写一个getParamSync函灵敏,第一个参数就是上下文,context是一个store对象,你也可以用解构的方式写出来,第二个参数还是我们要写入的接收到的参数,来改变触发mutations事件,再通过mutation来改变state,很好理解不难
然后我们就在组件里这么调用就可以了
this.$store.dispatch('getParamSync',{
keyCode,
keyWord,
hunterCode,
sid,
ck,
tm
})
那组合action又是怎么玩呢?我们有时候向后台请求时,要通过第一个AJAX返回值来进行下一个action分发
我们可以用promise来进行异步处理
actions.js
export default {
getParamSync (context,Object) {
return new Promise((reslove,reject)=>{
setTimeout(()=>{
context.commit('getParam',Object)
return reslove('成功')
},3000)
})
},
changetitleSync ({commit},title){
setTimeout(()=>{
commit('changetitle',title)
},3000)
}
}
在getParamSync使用new promise之后,在resolve里返回‘成功’,再分发一个changetitleSync改变title的action方法
mutations.js
export default{
getParam (state,Object) {
state.START_PARMA = Object
},
changetitle (state,title){
state.title = title
}
}
再在注册一个改变title的changetitle的type类型
组中间调用
created(){
this.$store.dispatch('getParamSync',{
keyCode,
keyWord,
hunterCode,
sid,
ck,
tm
}).then((res)=>{
this.$store.dispatch('changetitleSync',res)
})
}
我们就可以在组件中进行一种链式调用,解决异步回调,来action套action,就成了一个组合action
关于其它辅助用法
- mapState 辅助函数
- mapGetters 辅助函数
- mapMutations 辅助函数
- mapActions 辅助函数
尤大神已经写的很全面了,大家可以参考vuex的官网,进行阅读一下。我在这里就没有必要再进行重新讲解了
总结
在vuex中,我认为vuex用在那里比较好?
只适合运用于一个视图内组件与组件之间的组合传递,不适用于跨页面,但是可以共用,为了不因用户刷新页面,要进行初始化再次调用。
不适合运用在那里
在自己写一些Ui组件给大家或者开源用的话,不适用于写在vuex中,应该暴露所接收的Props,通过$emit来进行触发事件,一些关键性全局状态,不也适合存vuex中,你可以选择localStorage,sessionStorage
Vuex 实践讲解的更多相关文章
- Vuex实践(下)-mapState和mapGetters
Vuex系列文章 <Vuex实践(上)> <Vuex实践(中)-多module中的state.mutations.actions和getters> <Vuex实践(下)- ...
- Vuex实践
本文来自网易云社区 作者:刘凌阳 前言 2017年对于Vue注定是不平凡的一年.凭借着自身简介.轻量.快速等特点,Vue俨然成为最火的前端MVVM开发框架.随着Vue2.0的release,越来越多的 ...
- vuex实践之路——笔记本应用(三)
Actions Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 可以包含任意异步操作. 让我们来注册一个简单的 act ...
- vuex实践之路——笔记本应用(二)
上一篇我们简单介绍了vuex在此项目中的作用. 这次来理一下项目的整体思路. main.js上次看过了,首先看App.vue文件 我们引入了Toolbar.vue,NodeList.vue,Edito ...
- vuex实践之路——笔记本应用(一)
首先使用vue-cli把环境搭建好. 介绍一下应用的界面. App.vue根组件,就是整个应用的最外层 Toolbar.vue:最左边红色的区域,包括三个按钮,添加.收藏.删除. NoteList.v ...
- Vuex实践小记
1.目录结构 2.开始(安装vuex) npm install vuex --save 3.编辑store/index.js(创建一个Vuex.store状态管理对象) import Vue from ...
- MySQL/RDS数据如何同步到MaxCompute之实践讲解
摘要:大数据计算服务(MaxCompute,原名ODPS)是阿里云提供的一种快速.完全托管的EB级数据仓库解决方案.本文章中阿里云MaxCompute公有云技术支持人员刘力夺通过一个实验向大家介绍了阿 ...
- UBoot讲解和实践-------------讲解(二)
UBoot ARM移植之阶段二 理论篇 stage2: 1.初始化本阶段要使用的硬件设备: 通常包括两方面: 1)初始化至少一个串口,以便和终端用户进行I/O输出信息. ...
- UBoot讲解和实践-----------讲解(一)
Boot Loader之ARM Uboot移植 阶段一 理论篇 1.boot loader需要完成的任务: 1>设计程序的入口地址 2&g ...
随机推荐
- python 测试时一个str是不是字符串
# -*- coding: cp936 -*- #python 27 #xiaodeng #测试时一个str是不是字符串 def isAstring(obj): ''' 测试一个str是不是字符串 b ...
- java2小结(草稿)
Struts2 Servlet 小的Java程序,运行在服务器端,接收和响应从客户端发送过来的请求 流程分析: Servlet生命周期? Servlet配置自动加载?(理解) 1.服务器在启动的时候, ...
- JavaScript RegExp Object 正则表达式入门
什么是 RegExp? RegExp 是regular expression的缩写. RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具. 当您检索某个文本时,可以使用一种模式来描述 ...
- 优化 App 的启动时间
这是一篇 WWDC 2016 Session 406 的学习笔记,从原理到实践讲述了如何优化 App 的启动时间. App 运行理论 main() 执行前发生的事 Mach-O 格式 虚拟内存基础 M ...
- block(八)作用域
//闭包 NSString* s =@"123"; void (^block)() = ^() { NSLog(@"%@",s); }; block();// ...
- 如何调试bash脚本
Bash 是Linux操作系统的默认Shell脚本.Shell是用来处理操作系统和用户交互的一个程序.Shell的脚本可以帮助用户自动化地和操作系统进行交互.你也可以理解为一种脚本式的编程.即然有编程 ...
- zookeeper注册中心安装(单机版)
下载zookeeper-3.4.9.tar.gz wget http://apache.fayea.com/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar. ...
- js 获取元素所有兄弟节点实例
比如一个ul里面有10个li,而第3个li上有特殊的样式(比如颜色为红色,其他为黑色).我想把其他所有li——不包括红的li——的颜色也设为红色,此时,就需要获得红li的所有兄弟节点. 兄弟,就是和你 ...
- nginx last 和break redirect 和 permanent
一.last & break (1)last 和 break 当出现在location 之外时,两者的作用是一致的没有任何差异. 注意一点就是,他们会跳过所有的在他们之后的rewrite 模块 ...
- SLA等级那些9的实际意义
1. 重要的系统起码要设计达到99.9%的可靠性吧. 俗称3个9,这是什么意思呢? (1-99.9%)*365*24=8.76小时,表示该软件系统在连续运行1年时间里最多可能的业务中断时间是8.76小 ...