Vuex

Vuex

vuex可以集中式管理所有组件的状态(singleton)

 

Vue.use(Vuex)

调用了Vuex对象的install方法,并给install方法传入Vue。

用户可以通过applyMixin或者Minxin或者hook vue.prototype._init方法来获取到用户传入的options

甚至添加一些方法等等。

 

 

Vuex内部原理

内部实例化了一个vue实例来实现响应式

// 实际代码
new Vuex.Store({
    state: {
        msg: 111
    }
})


// 内部操作
new Vue({
    data: {
        $$state: { // 因为不需要将data代理到vue实例上,所有用了$
            msg: 111
        }
    }
})

至于getters也是通过vue中method来实现的

 

 

如何修改vuex的状态

1. 通过this.$store.state.xx = "changed"(非严格模式下)

2. 通过mutation

 

 

为什么推荐使用mutation来修改状态

其实是为了更好的调试。在调用mutation方法时,vuex会记录之前的状态与修改之后的状态。(vue devTool插件)

 

 

Vuex是怎么知道状态并非通过mutation来修改的?

commit方法提交修改的时候会有个_iscommitting标记位。提交之前是true,提交完毕变成false。

Vuex可以watch下state,如果state修改了,就看看标记位是不是true,不是的话,那么肯定是直接修改的state。

 

 

如何得知action调用结束?

可以在action里返回一个Promise。

 

有些观点认为action都会提交mutation的,所以看看mutation是否被调用即可。

我认为不妥,其一是mutation可能并非在action的最后一步调用。

其二是观察mutation的函数是否被调用不太好实现。得hook了,侵入性强。

 

posted @ 2021-08-19 20:28  re大法好  阅读(52)  评论(0编辑  收藏  举报