Vuex的使用教程

Vuex 是什么?

官方:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 的官方调试工具devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。

个人理解:加入vuex会使项目变得更加复杂,遇到组件间频繁通信时,需要在组件外部管理状态时,vuex会让开发更加便捷。

安装vuex

npm i vuex --save

制作一个简单的计数应用

src/

新建 store/modules/Add.js

export const Add = {
    state:{
        count:0
    },

    mutations:{
        increment(state) {
            state.count++;
        },

        decrement(state) {
            state.count--;
        }
    },

    actions:{
        increment: ({commit}) => commit('increment'),

        decrement: ({commit}) => commit('decrement'),

        incrementIfOdd({commit,state}){
            if ((state.count + 1) % 2 === 0) {
                commit('increment');
            }
        },

        incrementAsync({commit}) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    commit('increment');
                    resolve();
                },1000);
            })
        }

    }
};

src/store

新建store.js

import Vue from 'vue';
import Vuex from 'vuex';
import {Add} from './modules/Add.js';

Vue.use(Vuex);

export const store = new Vuex.Store({
    modules:{
        Add
    }
});

src/main.js修改为

import Vue from 'vue';
import App from './app';
import {router} from './router.js'
import {store} from './store/store';

new Vue({
    el: '#app',
    router,
    store,
    render: h => h(App)
}).$mount('#main');

src/components/first.vue修改为

<template>
    <div id="first">
        <mainHeader></mainHeader>
        <div class="main">这里是first</div>
        <div class="count">
            {{$store.state.Add.count}}
        </div>
        <div class="button">
            <button @click="increment">Add</button>
            <button @click="decrement">Dec</button>
            <button @click="incrementIfOdd">AddIfOdd</button>
            <button @click="incrementAsync">AddSync</button>
        </div>
        <div class="main-link">
            <router-link to="/first">Go to first</router-link>
        </div>
        <div class="main-link">
            <router-link to="/second">Go to second</router-link>
        </div>
        <mainFooter></mainFooter>
    </div>
</template>
<script>
    import * as main from '../main/main'; //导入刚才注册的两个模块
    import { mapActions } from 'vuex'; //导入actions
    export default{
        name:'first',

        methods:{
            ...mapActions([
                'increment', // 映射 this.increment() 为 this.$store.dispatch('increment')
                'decrement',
                'incrementIfOdd',
                'incrementAsync'
            ])
        },

        components:{ //注册组件为当前模块的子模块
            mainHeader:main.header,
            mainFooter:main.footer
        }
    }
</script>

<style lang="less" scoped rel="stylesheet/less" type="text/css">
    .main{
        text-align: center;
        font-size:16px;
        margin: 50px;
    }
    .count{
        font-family:"Microsoft YaHei UI";
        text-align: center;
        font-size:30px;
    }
    .button{
        .count;
    }
</style>

src/components/seconds修改为

<template>
    <div id="second">
        <mainHeader></mainHeader>
        <div class="main">这里是second</div>
        <div class="count">
            {{$store.state.Add.count}}
        </div>
        <div class="main-link">
            <router-link to="/first">Go to first</router-link>
        </div>
        <div class="main-link">
            <router-link to="/second">Go to second</router-link>
        </div>
        <mainFooter></mainFooter>
    </div>
</template>
<script>
    import * as main from '../main/main'; //导入刚才注册的两个模块
    export default{
        name:'second',

        components:{ //注册组件为当前模块的子模块
            mainHeader:main.header,
            mainFooter:main.footer
        }
    }
</script>

<style lang="less" scoped rel="stylesheet/less" type="text/css">
    .main{
        text-align: center;
        font-size:16px;
        margin: 50px;
    }
    .count{
        font-family:"Microsoft YaHei UI";
        text-align: center;
        font-size:30px;
    }
</style>

现在进入页面 然后测试四个按钮,同时切换到second路由,会发现组件通信已经完成了

vuex在处理组件之间的通信和状态管理上,是非常好用的,具体请参照文档。


results matching ""

    No results matching ""