状态管理器

在Redux中,Redux让应用的数据被集中管理,整个应用的state储存在唯一的store对象中,并且只能通过触发action的方式来修改state。

 

在Vuex中, Vuex是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态。

1.state对象包含了应用的全部的状态
2.通过getters来获得state中的状态,或者是通过这些状态派生出来的一些状态
3.如果想修改state中的状态值,只能通过提交mutation的方式
4.action用来提交mutation,可以包含异步操作。 action只会被 store.dispatch方法触发

 

创建一个简单的状态管理器来模拟Redux或Vuex的状态转换。

// 自执行创建模块
(function() {
    /* states 结构预览
    states = {
        a: 1,
        b: 2,
        m: 30,  
        o: {}
    }*/

    var states = {};  // 私有变量,用来存储状态与数据

    // 判断数据类型
    function type(elem) {
        if(elem == null) {
            return elem + '';
        }
        return toString.call(elem).replace(/[\[\]]/g, '').split(' ')[1].toLowerCase();
    }


    /**
     * @Param name 属性名
     * @Description 通过属性名获取保存在states中的值
    */
    function get(name) {
        return states[name] ? states[name] : '';
    }

    function getStates() {
        return states;
    }

    /*
    * @param options {object} 键值对
    * @param target {object} 属性值为对象的属性,只在函数实现时递归中传入
    * @desc 通过传入键值对的方式修改state树,使用方式与小程序的data或者react中的setStates类似
    */
    function set(options, target) {
        var keys = Object.keys(options);
        var o = target ? target : states;

        keys.map(function(item) {
            if(typeof o[item] == 'undefined') {
                o[item] = options[item];
            }
            else {
                type(o[item]) == 'object' ? set(options[item], o[item]) : o[item] = options[item];
            }
            return item;
        })
    }

    // 对外提供接口
    window.get = get;
    window.set = set;
    window.getStates = getStates;
})()

// 具体使用如下

set({ a: 20 });     // 保存 属性a
set({ b: 100 });    // 保存属性b
set({ c: 10 });     // 保存属性c

// 保存属性o, 它的值为一个对象
set({ 
    o: {
        m: 10,
        n: 20
    }
})

// 修改对象o 的m值
set({
    o: {
        m: 1000
    }
})

// 给对象o中增加一个c属性
set({
    o: {
        c: 100
    }
})
console.log(getStates())

 



posted @ 2017-03-21 16:22  我的老婆是校花  阅读(194)  评论(0编辑  收藏  举报