Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。

当我们组件的层级变得复杂,多个组件共享状态时数据的流动容易被破坏,容易发生混乱,难以管理。
两个常见的场景:

  1. 多个视图依赖于同一状态。
  2. 来自不同视图的行为需要变更同一状态。
    在这种时候,维护状态是极其困难的。

vuex应运而生。vuex可以将组件的那一些需要共享的状态抽取出来,以一个全局单例模式进行管理。也就是说,无论哪一个组件,都可以获取到这些共享的状态,或者触发行为来改变状态。

这就是vuex的主要原理。下面是一个使用vuex的demo。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.13/dist/vue.js"></script>
    <script src="https://unpkg.com/vuex@3.0.1/dist/vuex.js"></script>
</head>
<body>
    <div id="app">
        <button @click="plus">+10</button>
        <counter></counter>
    </div>
</body>
<script>
    // 创建一个store
    const store = new Vuex.Store({
        state:{
            count:20
        },
        //更改 Vuex 的 store 中的状态的唯一方法是提交 mutation
        //要唤醒一个 mutation handler,你需要以相应的 type 调用 store.commit 方法
        // mutation 可以有参数,称作载荷
        mutations:{
            plus(state,n){
                state.count+= n;
            }
        },
        //Action 提交的是 mutation,而不是直接变更状态
        //Action 可以包含任意异步操作
        actions:{
            // plusAction(context){
            //     context.commit("plus",10)
            // }

            //参数解构简化代码,效果跟上面那个一样
            plusAction({commit}){
                commit("plus",10)
            }
        },
        // getter用于从 store 中的 state 中派生出一些状态
        getters:{
            countMul(state){
                return state.count * 10;
            }
        }
    })
    // 计数器组件
    const counter = {
        template: `<div>计时器:{{count}} {{countMul}}</div>`,
        computed: {
            count(){
                return this.$store.state.count;
            },
            countMul(){
                return this.$store.getters.countMul;
            }
        }
    }
    // 新建vue实例
    new Vue({
        el: "#app",
        //在根实例中注册 store 选项,该 store 实例会注入到根组件下的所有子组件中,且子组件能通过 this.$store 访问到
        store: store,
        data:{
            somedata: "这里是一些数据。"
        },
        components:{
            counter
        },
        methods:{
            plus(){
                // 用mutation触发
                // this.$store.commit("plus",10);
                
                // 用action触发
                this.$store.dispatch("plusAction",10)
            }
        }
    })
</script>
</html>
posted @ 2018-03-07 10:13  xzhx  阅读(111)  评论(0编辑  收藏  举报