vuex适用于大型单页应用。每一个Vuex应用的核心就是store(仓库),store中储存大量状态,Vuex的状态存储是响应式的。vuex使用单一状态树,一个对象包含了全部的应用层级状态,每个应用仅仅包含一个store实例。调试页面,有可能会用到dev-tools

一、概念

1、state(共享的状态)

要get状态,需要在计算属性computed中返回状态。要get多个状态,可以借助mapState辅助函数生成计算属性。

state属性在store实例中设置,mapState函数在vue实例的computed属性中写。

state:{
a: ''
}
//实例中
computed: {
getStateA(){
return store.state.a
}
}
//组件中
import { mapState } from 'vuex' export default {
computed: {
...mapState(['a']),
getStateA(){
return this.a;
}
}
}

2、getters(共享的方法,该方法用于get状态)

实现多个组件共享同一个状态,getters属于store的计算属性,根据依赖缓存返回值,当依赖变化时,重新计算。

getters属性在store实例中设置,mapGetters函数在vue实例或组件的computed属性中写。

getters: {
getterA: state => {
return state.a
}
}
//实例中
computed: {
getGetterA() {
return store.getters.getterA
}
}
//组件中
import { mapGetters } from 'vuex' export default {
computed: {
...mapGetters(['getterA']),
getGetterA(){
return this.getterA;
}
}
}

3、mutations(修改状态)

mutation必须是同步函数,因为回调函数进行的状态改变不能被追踪,因为mutation触发的时候,回调函数还没有被调用。

mutations属性在store实例中设置,直接修改状态,mapMutations函数在vue实例或组件的methods属性中写。

mutations: {
mutationA: state => {
state.count++
}
}
//实例中
methods: {
eventA() {
this.$store.commit('mutationA');
}
}
//组件中
import { mapMutations } from 'vuex' export default {
methods: {
...mapMutations(['mutationA']),
eventA(){
this.mutationA();
}
}
}

4、actions(提交mutation)

store中的状态是响应式的,要set状态,不能直接改变数据,而是需要提交mutation。actions属性在store实例中设置,不会直接变更状态,而是提交mutation,可以包含异步操作。mapActions函数在vue实例或组件的methods属性中写。下面介绍4种提交mutaion的办法,仅供参考。

A、在组件中提交mutation

mutations:{
//改变状态
mutationA(state, { adata }) {
state.awords = adata;
}
}
//全局定义store,在组件中提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
store.commit('mutationA',{ adata });
}
}
//在组件内提交mutation
methods:{
eventF(adata){
// 以载荷形式提交mutation
this.$store.commit('mutationA',{ adata });
}
}

B、在组件中提交mutation之mapMutations

import { mutationA, mutationB } from './mutation-types'

export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
import { mapMutations } from 'vuex'
export default {
  methods: {
...mapMutations([
'mutationA',
'mutationB'
]),
...mapMutations({
add: 'mutationA'
}),
eventA(){
this.mutationA();
},
eventB(bdata){
this.mutationB(bdata);
},
eventC(cdata){
this.add(cdata);
}
}
}

C、在actions中提交mutation

mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
//在actions中提交mutation,同步,异步
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
//在组件中分发action
methods:{
eventA(){
store.dispatch('actionA','我是老大');
}
}

D、在actions中提交mutation之mapActions

import { mutationA, mutationB } from './mutation-types'

export default {
[mutationA](state,payload){
state.dataA = payload;
},
[mutationB](state,payload){
state.dataB = payload;
}
}
//actions.js,提交mutation
import { mutationA, mutationB } from './mutation-types' export default {
actionA({commit,state}, payload){
commit(mutationA, payload);
},
actionB({commit,state}, payload){
commit(mutationB, payload);
}
}
import { mapActions } from 'vuex'

//在组件中分发action
methods:{
...mapActions(['actionA', 'actionB']),
eventA(){
this.actionA('我是老大');
},
eventB(){
this.actionB('我是老二');
}
}

5、modules

解决状态多导致store对象臃肿,将store分割成模块,每个模块拥有自己state,getters,mutations,actions。

二、vuex的引用方法
1、用script标签

<script src="https://unpkg.com/vuex"></script>

2、npm安装

cnpm install vuex
//在js文件引入
var Vue = require('vue')
var Vuex = require('vuex') Vue.use(Vuex)

三、参考案例

四、简单版父子组件通信

const store = new Vuex.Store({
state:{
fwords: '一朵红花',
awords: '我是老大'
},
getters:{
getAwords(state){
return state.awords
}
},
mutations:{
//改变状态
listenA(state, { adata }) {
state.awords = adata;
}
}
})

1、父组件给子组件传递消息

//父组件
<com-a :apropVal="getFwords"></com-a> computed:{
getFwords(){
return store.state.fwords
}
}
//子组件
<h3>父亲给我了,{{ apropVal }}</h3> props:['apropVal']

2、子组件给父组件传递事件

//子组件
<input type="button" value="A和父亲说话" @click="eventAf"> methods:{
eventAf(){
this.$emit('a-f-msg',`谢谢父亲`);
}
}
//父组件
<com-a @a-f-msg="eventFa"></com-a> methods:{
eventFa(adata){
// 以载荷形式提交mutation
store.commit('listenA',{ adata });
}
}

五、简单版兄弟组件通信

const store = new Vuex.Store({
state:{
awords: '',
bwords: ''
},
getters:{
getAwords(state){
return state.awords
},
getBwords(state){
return state.bwords
}
},
mutations:{
//改变状态
mutationA(state, payload) {
state.awords = payload;
},
//改变状态
mutationB(state, payload) {
state.bwords = payload;
}
},
actions:{
actionA({commit,state},payload){
commit('mutationA',payload);
},
actionB({commit},payload){
new Promise((resolve,reject)=>{
setTimeout(()=>{
commit('mutationB',payload);
resolve();
},1000)
})
}
}
})
//子组件A
<h4>B传过来的数据是:{{ store.getters.getBwords }}</h4>
<input type="button" value="把值传给B" @click="eventAb"> methods:{
eventAb(){
store.dispatch('actionA','我是老大');
}
}
//子组件B
<h4>A传过来的数据是:{{ store.getters.getAwords }}</h4>
<input type="button" value="把值传给A" @click="eventBa"> methods:{
eventBa(){
store.dispatch('actionB','我是老二');
}
}

六、综合版父子兄弟组件通信

1、语法基础

A、引入和输出模块

//store.js,默认输出
export default store;
//main.js
import store from 'store.js';
// constants.js
export const A = 1;
export const B = 3;
//main.js
import { A, B } from './constants.js';
// constants.js,跨模块常量
export const A = 1;
export const B = 3;
export const C = 4;
// main.js
import * as constants from './constants';
console.log(constants.A); //
console.log(constants.B); //

B、对象扩展运算符

将多个对象合并为一个,传给computed属性。

# 安装插件
npm i -D babel-plugin-transform-object-rest-spread
#配置文件babelrc
{
"presets": ["env"],
"plugins": ["transform-runtime","transform-object-rest-spread"]
}
//组件内
computed:{
...mapGetters(['getterA','getterB','getterC'])
}

C、对象属性名用常量表达式

//mutation-types.js
export const MUTATION_A = 'MUTATION_A';
//mutations.js
import { MUTATION_A } from './mutation-types'; export default {
[MUTATION_A](state,payload){
state.dataA = payload;
}
}

D、对象参数的解构赋值

//actions.js
import { MUTATION_A } from './mutation-types';
//解构赋值前,context是一个对象
export default {
actionA(context, payload){
context.commit(MUTATION_A, payload);
}
}
//解构赋值后
export default {
actionA({commit, state}, payload){
commit(MUTATION_A, payload);
}
}

commit = context.commit,为什么这样解构赋值?查看原理

2、父组件给子组件传递

3、子组件给父组件传递

4、兄弟组件相互传递

vuex那些事儿的更多相关文章

  1. 关于Vuex的那些事儿

    vuex vuex是一个专门为Vue.js应用程序开发的状态管理模式,集中式的存储应用的所有组件的状态 以相应的规则保证状态以一种可预测的方式发生变化 单向数据流 State:驱动应用的数据源(单向数 ...

  2. Vue2.0 探索之路——生命周期和钩子函数的一些理解 - JS那些事儿

    在使用vue一个多礼拜后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对于mounted这个挂载还不是很清楚的.放大之,对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这 ...

  3. 一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app

    一步一步教你用 Vue.js + Vuex 制作专门收藏微信公众号的 app 转载 作者:jrainlau 链接:https://segmentfault.com/a/1190000005844155 ...

  4. Vuex、Flux、Redux、Redux-saga、Dva、MobX

    https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...

  5. vuex存取token,http简单封装、模拟登入权限校验操作、路由懒加载的几种方式、vue单页设置title

    1.config index.js下面的跨域代理设置: proxyTable: { '/api': { target: 'http://xxxx', //要访问的后端接口 changeOrigin: ...

  6. vuex分模块3

    nuxt 踩坑之 -- Vuex状态树的模块方式使用 原创 2017年12月20日 11:24:14 标签: vue / nuxt / vuex / 模块化 / 状态管理 874 初次看到这个模块方式 ...

  7. Vuex,从入门到...

    Vuex 是什么? 官方是这么说的:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 不懂? ...

  8. 说说Makefile那些事儿

    说说Makefile那些事儿 |扬说|透过现象看本质 工作至今,一直对Makefile半知半解.突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不 ...

  9. 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库

    应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...

随机推荐

  1. poj1236 SCC+缩点

    /* 强连通分量内的点可以互相传送,可以直接缩点 缩点后得到一棵树 第一问的答案是零入度点数量, 第二问: 加多少边后变成强连通图 树上入度为0的点有p个,出度为0的点为q,那么答案就是max(p,q ...

  2. mybatis常见错误总结

    1. 现象:mybatis xml文件中查询的返回类型写成list或java.util.List时,执行sql时报 java.lang.UnsupportedOperationException错误. ...

  3. Nginx详解二:Nginx基础篇之Nginx的优点

    Nginx是一个开源且高性能.可靠的HTTP中间件.代理服务 常见的HTTP服务: HTTPD--Apache基金会 IIIS--微软 GWS--Google(不对外开放) Nginx优势: 一.IO ...

  4. JAVA中的Token

    JAVA中的Token 基于Token的身份验证 来源:转载 最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求 ...

  5. C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_08_upload\work\Catalina\localhost\ROOT这个错误是找不到temp文件

    C:\Users\Administrator\.IntelliJIdea2017.3\system\tomcat\Unnamed_08_upload\work\Catalina\localhost\R ...

  6. python 装饰器--对有无参数的函数进行装饰

    # 使用装饰器无参数的函数进行装饰# def func(funcionName): # print('-----1------') # def func_in(): # print('--func_i ...

  7. MySql定期存档数据

    # 创建归档表(只复制表结构和索引) CREATE TABLE Orders_2016 like Orders; # 删除归档表的所有索引(这样可以提高插入速度) # 以前的数据导入归档表 INSER ...

  8. checkbox选中相关问题总结

    html: <input type="checkbox" name="fruit" id="apple">苹果 <inpu ...

  9. C语言整理——文件系统和文件访问

    标准C中规定了文件系统的访问和对文件本身的访问.不管是windows系统或者是泛unix系统,都实现了这些接口.在了解这些知识后,跨平台编程也将非常容易. 对文件系统的访问接口有: chdrive() ...

  10. npm淘宝镜像的设置和删除

    设置 npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao ...