前言
Vuex是一个专为Vue.js应用程序开发的状态管理模式;Vuex的设计思想是使用单一状态树,用一个对象state包含了整个应用层级的所有状态,你可以理解为这些状态就是一堆全局变量和数据。
效果图
用vuex实现一个输入书名,显示书的列表,书的列表中的数据可以删除,还能够显示总书的数量的功能。

实现过程
首先用vue-cli创建一个项目
vue create your-project
因为是为了做vuex的演练,所以只选择vuex就可以了

<template>
<div>
<input type="text" placeholder="请输入书籍名称" v-model="value"/>
<button v-on:click="addBook()">新增书籍</button>
</div>
</template>
<script>
export default {
methods:{
addBook(){
var item = {
value:this.value,
id:++this.id
}
this.value = '';
this.$store.dispatch('onAddBook',item);
}
},
data(){
return{
value:'',
id:0
}
}
}
</script>
书的展示列表抽象为组件book-list.vue
<template>
<div>
<ul>
<li v-for="item in books" :key="item.id">
<span>{{item.value}}</span>
<button v-on:click="deleteBook(item.id)">删除书籍</button>
</li>
</ul>
</div>
</template>
<script>
import {mapState} from 'vuex'
export default {
computed:{
...mapState([
'books'
])
},
methods:{
deleteBook(id){
this.$store.dispatch('onDelBook',id);
}
},
}
</script>
最关键的vuex插件需要做的事情来了,store/index.js中内容:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
books: [{ id: 0, value: 'VueJs开发' }],
},
//对数据获取之前的再次编译,可以理解为state的计算属性
//获取数据的方法
getters: {
totalCount(state){
return state.books.length;
}
},
//组件中自定义事件,修改状态,并且是同步的,在组件中使用$store.commit('',params)这个和我们组件中的自定义事件类似
//显示的更改state里的数据
mutations: {
onDelBook(state,id){
state.books = state.books.filter(item=>item.id !== id);
},
onAddBook(state,item){
state.books.push(item);
}
},
//异步操作。在组件中使用是$store.dispatch('')
actions: {
onDelBook({ commit }, id) {
commit('onDelBook', id);
},
onAddBook({commit},item){
commit('onAddBook',item);
}
},
//store的子模块,为了开发大型项目,方便状态管理而使用的
modules: {
}
});
最后在主页中引入book-input.vue和book-list.vue组件即可
<template>
<div id="app">
<book-input></book-input>
<book-list></book-list>
<p>书的总数:{{totalCount}}</p>
</div>
</template>
<script>
import {mapGetters} from 'vuex'
import bookInput from "./components/book-input.vue";
import bookList from "./components/book-list.vue";
export default {
name: "app",
components: {
bookInput,
bookList
},
data:{
totalCount:0,
},
computed:{
...mapGetters({totalCount:'totalCount'})
}
};
</script>
<style>
#app {
font-family: "Avenir", Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
}
#nav {
padding: 30px;
}
#nav a {
font-weight: bold;
color: #2c3e50;
}
#nav a.router-link-exact-active {
color: #42b983;
}
</style>