Vuex你应该知道的事

700 阅读2分钟

前言

Vuex是一个专为Vue.js应用程序开发的状态管理模式;Vuex的设计思想是使用单一状态树,用一个对象state包含了整个应用层级的所有状态,你可以理解为这些状态就是一堆全局变量和数据。

效果图

用vuex实现一个输入书名,显示书的列表,书的列表中的数据可以删除,还能够显示总书的数量的功能。

实现过程

首先用vue-cli创建一个项目

vue create your-project

因为是为了做vuex的演练,所以只选择vuex就可以了

首先将新增书这个功能做个组件,book-input.vue

<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>