vuex的实用知识点
本文系统介绍vuex的全部内容
为什么用vuex
组件通信知道吧,相信很多同学,刚学的时候很难懂,实时上在实际应用中,大型项目如果使用最原始的组件通信会非常的麻烦,主要体现在多层嵌套的组件之间的通信,使用vuex可以很方便的处理和维护state
开始
1.vuex的特点
**当store容器中的数据发生变化了,那么组件中的数据也会跟着发生变化
**更改store中的state值,必须使用commit
2.安装
npm install vuex --save
Vue.use(Vuex)
3.基本使用
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state){
state.count++
}
}
})
state
在单文件系统中,组件都是单独的文件如果想访问到vuex的store中的数据需要重复的导入store文件,非常麻烦,可以使用如下方式,只需导入一次即可
const app = new Vue({
el: '#app',
store,
...
})
就是将store实例,直接赋值给vue根组件的store属性,然后在此根组件下面所有的子组件都可以通过this.$store.state访问到store中的state
一般获取到store中的某个属性值,会在组件中使用计算属性重新声明一个属性,如下
const Counter = {
template: '<div>{{count}}</div>',
computed: {
count(){
return this.$store.state.count
}
}
}
如果你需要的属性值,很多,那么你叫重复的写很多类似的代码,很麻烦,这时可以使用mapState辅助函数,使用方法如下
import {mapState} from 'vuex' //导入辅助函数
export default {
computed: mapState({
count: state => state.count // 不做任何处理直接导入
count: 'count' // 和上面的作用一样
count // 同名的可以直接简写
count(state){
return state.count + this.otherValue
} // 做特殊处理
})
}
上面可以看到一个mapState将一个computed全占了,这时我要是有自己的计算属性可以使用对象展开运算符
computed: {
localComputed(){},
...mapState({
//...
})
}
getters
有些store中的state,并不是组件中需要的数据,而组件要的是基于这个state通过计算后的值,这时可以在store中使用getters选项,这和组件的computed的功能是一模一样的
const store = new Vuex.Store({
state: {
a: 1
},
getters: {
incre: state => {
return state.a + 1
}
}
})
那么incre就是2了
可以通过store.getters.a或者this.$store.a访问
还可以传递其他的getters,后面具体讲解
incre: (state,getters) => {
return getters.a + 1
}
mapGetters函数的使用
和mapState一样
import { mapGetters } from 'vuex';
export default {
computed: {
...,
...mapGetters([
'incre'
])
}
}
mutations
mutation就是用来同步的修改state中的数据的
const store = new Vuex.Store({
state: {
count: 1
},
mutations: {
increment(state,value){
state.count++
}
}
})
调用mutation中的方法需要 store.commit('increment')
传递数据 store.commit('increment', 10)
为了保证好的代码风格,可以统一的传递对象
mutations: {
increment (state,payload) {
state.count += payload.amount
}
}
store.commit('increment',{
amount: 10
})或者
store.commit({
type: 'increment',
amount: 10
})
注意:mutation只能写同步的函数,至于原因是vue的devtool无法捕捉状态,这个devtool几乎用不上
使用mapMutations函数
在组件中使用mutations中的函数,最好都放在methods里面,方便管理
import { mapMutations } from 'vuex'
methods: {
...,
...mapMutations([
'increment'
])
}
actions
其实actions的功能和methods类似,可以用来处理异步的函数,然后将结果通过mutation传递
actions: {
incre(context){
context.commit('increment')
}
} // context 具有和store相同的属性和方法
也可以使用es6的语法
actions: {
incre({commit}) {
commit('increment')
}
}
触发action中的方法 store.dispatch('incre')
或者
store.dispatch('incre',{
amount: 10
})
或者
store.dispatch({
type: 'incre',
amount: 10
})
使用mapActions函数
import { mapActions } from 'vuex';
export default {
...,
...mapActions([
'increment'
])
}
modules
这部分内容其实就是将如何将一个store拆分成多个小的store
const moduleA = {
state: {...},
...
}
const store = new Vuex.Store({
modules: {
a: moduleA
}
})
这就把A模块合并到store中了,通过store.state.a访问moduleA的state
你要清楚,本质上着就是合并对象,所以你可以使用平常的methods和mutations等使用方法,因为他们实际上就是合并成了一个methods或者mutations等,所以这样就会有一个问题,子模块和子模块、主模块之前的命名冲突问题,但是注意,细心的同学可能发现了,上面介绍的store.state.a这样不可能出现命名冲突,这是对的,因为vue默认只对state做了分开的处理,所以你在子模块中的actions这类的属性中访问到主模块store中的数据必须传递第三个参数rootState,如下
const moduleA = {
actions: {
incre({state,commit,rootState}) {
...
}
}
}
要解决上面提到的命名冲突的问题就要使用到命名空间,如下
const moduleA = {
// 添加下面这句话,这个模块就是独立的了,不会和外界发生冲突
namespaced: true,
// state不会受到命名空间的影响
// 在外界要访问到此模块的getters,actions等,需要添加路径
getters: {
isAdmin(){....} // getters['moduleA/isAdmin']
}
}
在命名空间中访问主模块的数据要添加 rootState,rootGetters
细节自查官网,用的真心很少,不同的模块的actions这类的名字能取成一样的也是奇葩
结语
还有一部分内容对于开发来说,没有任何作用,学习就要把自己宝贵的时间放在对你最有用的东西上面
这部分内容是我关于vue的最后的一篇知识归纳,以后将全身心的投入到react的学习当中
vuex的实用知识点的更多相关文章
- HTML5实用知识点
本文讲解HTML5实用知识点 新增的表单type Canvas使用 SVG使用 Audio使用 Video使用 网页缓存 文件缓存 后台worker Server-Sent Events 定位 拖放功 ...
- canvas学习笔记,实用知识点总结(上)
本博客是本人日常学习笔记,作为重要知识点的总结记录,随笔风格可能更倾向于个人的学习习惯和方式,若对您有帮助十分荣幸,若存在问题欢迎互相学习探讨,前端小白一枚在此恭候. 一.基本使用规则 1.创建画布 ...
- 浅谈vuex使用方法(vuex简单实用方法)
Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.Vuex 也集成到 Vu ...
- sass实用知识点
本文总结sass相关核心知识点 说明:本文的内容是,我在开发实践中总结的实用性比较强的sass知识点,其他未涉及的知识,如果对你有作用请自行查阅 sass知识目录 嵌套 注释 SassScript @ ...
- dubbo实用知识点总结(三)
1. 服务降级 2. 优雅停机 3. 主机绑定 4. 访问日志 5. Multicast注册中心 6. zookeeper注册中心 7. 推荐用法 8. 容量规划 9. 基准测试工具包
- dubbo实用知识点总结(一)
1. dubbo基础架构 架构 特性 服务提供者 服务消费者 配置可以用dubbo.properties来替换 2. 注解配置 提供方(注意:serivce注解是dubbo的service) 消费者 ...
- dubbo实用知识点总结(二)
1. 参数验证 2. 结果缓存 3. 泛化引用 客户端没有对应接口类的情况,可以直接调用 4. 泛化实现 5. 回声测试 用于检测服务是否可用 6. 上下文信息 7. 隐式传参(不常用) 8. 异步调 ...
- WPF实用知识点
1.一个基本的WPF程序, 需要引入的程序集WindowsBase, PresentationCore, PresentationFramework using System; using Syste ...
- Node.js实用知识点
本文介绍如何使用nodejs 简单的HttpServer 调试nodejs 基础路由 nodejs配置开发和生产环境 nodejs核心模块一览 express用法 文件I/O nodejs模块 nod ...
随机推荐
- 亚马逊chime启用新顶级.aws域名后缀
自2013年12月亚马逊AWS公有云服务落地中国,亚马逊AWS在中国市场展开了一系列的活动,激发了国内开发者对亚马逊AWS云平台的热情. chime是亚马逊为客户提供视频会议领域的服务,而.aws是由 ...
- C#将字符转换成utf8编码 GB321编码转换
public static string get_uft8(string unicodeString) { UTF8Encoding utf8 = new UTF8Encoding(); Byte[] ...
- mini6410基于linux2.6.36内核通过NFS启动根文件系统总结(一搭建开发环境——建立NFS服务器)
http://blog.csdn.net/yinjiabin/article/details/7489030 建立 nfs 服务器 在嵌入式 linux 开发的时候,常常需要使用 nfs 以方便程序的 ...
- BZOJ3244/UOJ122 [Noi2013]树的计数
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- spring的事物回滚
//默认spring只能在捕获到runtimeException时才会回滚, throw new RuntimeException("出现runtime异常"); } catch ...
- getchar与scanf区别
scanf可以一次按照设定的输入格式输入多个变量数据.如int d,float f,char str[20],scanf("%d%f%s",d,f,str); getchar()只 ...
- 【codesmith】 初次试用(未发布)
一直都有听过codesmith,一个很好用的软件,减少大量代码的输入,比如你生成一个list,并添加5个项. ArrayList list1=new ArrayList(); list1.Add( ...
- BW ON HANA 业务模型关系与数据取数
在接到业务需求之后,我认为重要的是理清楚自己该做什么.来实现业务.由于不了解业务,还是走了很多弯路.本可以不用这么做,还是这么做了.自然你最傻瓜的按照用户的方式去实现是没有问题的. 会使后面的人难以维 ...
- 【ORM】关于Dapper的一些常见用法
引言 Dapper是.Net平台下一款小巧玲珑的开源Orm框架,简单实用的同时保持高性能,非常适合我这种喜欢手写SQL的人使用,下面介绍一下如何使用Dapper. 相关资料 Dapper的GitHub ...
- 22 Python 模块与包
一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...