源码地址https://github.com/zhengyixun/VUEX
我使用的是vue-cli+vuex,vue-cli的安装和使用想必就不用我多说了,我这里主要说一下vuex在vue-cli中的使用方法
首先在你的vue-cli下安装vuex
npm install vuex --save--dev
在你的src目录下新建一个Store文件夹,用来存放store.js等等
store
|+store.js
|+action.js
|+mutation.js
|+state.js
|+getter.js
每个对应js对应其相应的功能,然后通过export default 暴露出去
State负责存储整个应用的状态数据,一般需要在使用的时候在跟节点注入store
对象,后期就可以使用this.$store.state
直接获取状态
前面说过不论是多大的一个应用,都只有一个store,当应用郭大师store就会变得庞大,为了解决以上的问题,引入modules,可以分割store,每个模块拥有自己的statemutataion action getter等,甚至可以嵌套子模块
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = new Vuex.Store({
modules: {
a: moduleA,
b: moduleB
}
})
store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态
state.js
const state = {
msg: '原始数据',
}
export default state;
store.js
import Vue from "vue";
import Vuex from "vuex";
import state from "./state.js";
Vue.use(Vuex) //这里注意,一定要使用一下
const store=new Vue.Store({
state
})
export default store;
然后需要在main.js中引用一下
import Vue from 'vue'
import App from './App'
import router from './router'
import store from "./store/store.js";
Vue.config.productionTip = false;
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
store,
components: { App },
template: ' '
});
在组件中
<template>
<div class="abc">
<input type="text" value="abc">
<div>{{msg}}div>
<button>按钮button>
div>
template>
<script>
//通过this.$store.state.msg
export default {
data(){
return {
msg:this.$store.state.msg,
}
},
}
script>
<style scoped>
style>
mutations.js
const mutation={
change(state){
state.count++;
alert(state.count)
}
};
export default mutation;
store.js中引入
import Vue from "vue";
import Vuex from "vuex";
import mutations from "./mutation.js";
Vue.use(Vuex);
//定义数据
var state={
count:0
};
var store=new Vuex.Store({
state,
mutations
});
export default store;
同样需要在main.js中挂载
组件中
<template>
<div class="abc">
<input type="text" :value="names">
<div>{{names}}div>
<button @click="clicks">按钮button>
div>
template>
<script>
export default {
data(){
return {
names:this.$store.state.names,
}
},
methods:{
clicks(){
this.$store.commit("change");
}
}
}
script>
action类似于mutation,但也有不同之处
用法如下
const store = new Vuex.Store({
state: {
count: 0
},
mutations: {
increment (state) {
state.count++
}
},
actions: {
increment (context) {
context.commit('increment') //调用mutations里的方法,而不是自己直接修改State
}
}
})
有些状态需要做二次处理需要使用getter方法
getter.js
const getters={
arrLength:(state)=>{
state.arr.length
}
};
export default getters;
以上代码的意思是通过读取state中arr属性,派生出一个新的属性arrLength
state
var state={
count:0,
arr:[1,2,3]
};
store.js和上面的一样
组件
<template>
<div class="abc">
<input type="text" :value="names">
<div @click="len">{{names}}div>
<button @click="clicks">按钮button>
div>
template>
<script>
import { mapGetters } from "vuex";
export default {
data(){
return {
names:this.$store.state.names,
}
},
methods:{
clicks(){
this.$store.commit("change");
},
len(){
console.log(this.$store.state) //这里查看有没有通过gettter方法派生出来新的state
}
},
computed:mapGetters([
'arrLength'
])
}
script>
<style scoped>
style>