【仿Vuex响应式源码实现】

本文探讨了Vuex中state响应式变化的原理,通过Object.defineProperty和Object.keys()实现。讲解了如何监听state对象,并定义commit方法触发mutations。
摘要由CSDN通过智能技术生成

仿Vuex响应式源码实现

state响应式原理

我们都知道store里的state是响应式变化的,那是怎么实现的呢?


原理还是利用了Object.defineProperty
Object.keys()方法会返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和使用for…in循环遍历该对象时返回的顺序一致

代码如下(示例):

var reactive = obj => {
    let deps = new Dep
    Object.keys(obj).forEach(key => { //Object.keys(obj)会变成一个数组
        let value = obj[key]  //state.count
        Object.defineProperty(obj, key, {
            get() {
                deps.getters()
                return value
            },
            set(newValue) {
                value = newValue //每次修改值执行
                deps.setters()
            }
        })
    })
    return obj
}

vuex代码如下:

class Store {
    constructor(options = {}) {
        const { state, mutations } = options
        this._vm = reactive(state)
        this._mutations = mutations
    }
    get state() {
        return this._vm
    }
    commit(type, params) {
        const entry = this._mutations[type]
        if (!entry) {
            return
        }
        entry(this.state, params)
    }
}
const store = new Store({
    state: {
        count: 0
    },
    mutations: {
        addCount(state, p) {
            state.count += p
        }
    },
})

var stop = watchEffect(() => {
    var str = `${store.state.count}`
    document.getElementById("app").innerText = str
})
document.getElementById('btn').addEventListener('click', function () {
    store.commit("addCount", 1)
})

对state对象进行监听,并且定义commit方法,调用时直接执行store实例上的mutations方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值