Vue原理-vuex

Vuex原理

store注入组件install方法
Vue.use(Vuex); // vue的插件机制,安装vuex插件

当ues(Vuex)时候,会调用vuex中的install方法,装在vuex!
下面时install的核心源码:

Vue.mixin({
        beforeCreate() {
            if (this.$options && this.$options.store) {
                //找到根组件 main 上面挂一个$store
                this.$store = this.$options.store
                // console.log(this.$store);

            } else {
                //非根组件指向其父组件的$store
                this.$store = this.$parent && this.$parent.$store
            }
        }
    })

store注入 vue的实例组件的方式,是通过vue的 mixin机制,借助vue组件的生命周期 钩子 beforeCreate 完成的。即 每个vue组件实例化过程中,会在 beforeCreate 钩子前调用 vuexInit 方法

Vuex如何实现响应式的

state实现:

    this._s = new Vue({ 
        data: {
            // 只有data中的数据才是响应式
            state: options.state
        }
    })

getters实现

//实现getters原理
    let getters = options.getters || {}
    // console.log(getters);
    // this.getters = getters; //不是直接挂载到 getters上 这样只会拿到整个 函数体
    this.getters = {};
    // console.log(Object.keys(getters))  // ["myAge","myName"]
    Object.keys(getters).forEach((getterName) => {
        // console.log(getterName)  // myAge
        // 将getterName 放到this.getters = {}中
        // console.log(this.state);
        Object.defineProperty(this.getters, getterName, {
            // 当你要获取getterName(myAge)会自动调用get方法
            // 箭头函数中没有this               
            get: () => {
                return getters[getterName](this.state)
            }
        })
    })

Vuex的state状态是响应式,是借助vue的data是响应式,将state存入vue实例组件的data中;Vuex的getters则是借助vue的计算属性computed实现数据实时监听。

注意:响应式和双向绑定不是一个概念

mutations实现
let mutations = options.mutations || {}
    // console.log(mutations);
    this.mutations = {};
    Object.keys(mutations).forEach(mutationName=>{
        // console.log(mutationName);

        this.mutations[mutationName] = (payload) =>{
            this.mutations[mutationName](this.state,payload)
        }
    })
action实现
// actions的原理 
let actions = options.actions || {}
this.actions = {};
forEach(actions,(actionName,value)=>{
    this.actions[actionName] = (payload)=>{
        value(this,payload)
    }
})
commit dispatch的实现
commit(type,payload){
    this.mutations[type](payload)
}
// type是actions的类型  
dispatch=(type,payload)=>{
    this.actions[type](payload)
}

参考链接:https://www.cnblogs.com/hjson/p/10500770.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值