简易vuex源码实现

Posted haishen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简易vuex源码实现相关的知识,希望对你有一定的参考价值。

kvuex.js  文件    (实现vuex插件)

// 1、维护状态state
// 2、修改状态commit
// 3、业务逻辑控制dispatch
// 4、状态派发getter
// 5、实现state响应式
// 6、插件
// 7、混入

let Vue

function install(_Vue, storeName = ‘$store‘) 
    Vue = _Vue

    // 混入:把store选项指定到Vue原型上
    Vue.mixin(
        beforeCreate() 
            // 判断main.js的当期组件选择中,是否有sotre   
            if(this.$options.store)
                Vue.prototype[storeName] = this.$options.store 
            
        
    )


class Store 
    // options:  state: count:0, mutations:count(state) 
    constructor(options = )
        // 利用vue数据响应式
        this.state = new Vue(
            data: options.state
        )

        // 初始化mutations
        this.mutations = options.mutations || 
        this.actions = options.actions || 
        options.getters && this.handleGetters(options.getters)
    

    // 触发mutations,需要实现commit
    commit = (type, arg) => 
        // this只想Store实例
        const fn = this.mutations[type] // 获取状态变更函数
        fn(this.state, arg)
     

    dispatch = (type, arg) => 
        const fn = this.actions[type]
        return fn(commit: this.commit, state: this.state, arg)
    

    // getters: score(state)return state.xx
    handleGetters(getters)
        this.getters =  // store实例上的getters

        // 定义只读的属性
        Object.keys(getters).forEach(key => 
            Object.defineProperty(this.getters, key, 
                get: () => 
                    return getters[key](this.state)
                
            )
        )
    


export default Store, install

 

kindex.js  文件  相当于store.js文件

import Vue from ‘vue‘
import KVuex from ‘../kvuex‘

Vue.use(KVuex)

export default new KVuex.Store(
    state: 
        count: 0
    ,
    mutations: 
        add(state, num = 1) 
            state.count += num
        
    ,
    getters:  // 相当于计算属性
        score(state) 
            return ‘score:‘ + state.count
        
    ,
    actions: 
        // 处理复杂业务逻辑,类似于controller
        // 比如ajax请求

        asyncAdd( commit )  // 参数解构,拿到上下文
            setTimeout(() => 
                commit(‘add‘)
            , 1000);
        

    
)

 

测试文件---vue文件

<template>
    <div>
        <h3>vuex test</h3>
        <p>$store.state.count</p>
        <p>$store.getters.score</p>
        <button @click="add">add</button>
        <button @click="asyncAdd">asyncAdd</button>
    </div>
</template>

<script>
export default 
    methods: 
        add() 
            this.$store.commit(‘add‘, 2)
        ,
        asyncAdd()
            this.$store.dispatch(‘asyncAdd‘)
        
    ,

</script>

 

以上是关于简易vuex源码实现的主要内容,如果未能解决你的问题,请参考以下文章

深入解读 Vuex 源码,并实现一个 Vuex

C语言实现简易日历(附源码)

C语言实现简易日历(附源码)

简易Vue-Router版源码实现

《游戏学习》Java实现的开心农场简易版源码以及素材

《游戏学习》Java实现的开心农场简易版源码以及素材