vuex中的state在元件中如何監聽?

silianpan發表於2017-05-23

前言

 不知道大家有沒有遇到過這樣一種情況? vuex中的state會在某一個組建中使用,而這個狀態的初始化是通過非同步載入完成的。元件在渲染過程中,獲取的state狀態為空。也就是說元件在非同步完成之前就已經完成渲染了,導致元件的資料沒有來得及渲染。

問題舉例

 舉例說明如下:

// topo.vue
created() {
    this.getUserAndSysIcons();
},
methods: {
    getUserAndSysIcons() {
        const self = this;
        // 使用者圖示
        iconApi.getUserIcons().then(response => {
        self.$store.dispatch('setUserIcons', response.data);
        });
    }
}複製程式碼

 在topo.vue中created或者mounted完成的時候呼叫 getUserAndSysIcons() 非同步初始化userIcons,方便在其他元件中使用這個資料。

// modifyhost.vue
mounted() {
    this.userIcons = this.$store.state.topo.userIcons; // 使用者圖示
}複製程式碼

 在modifyhost.vue中渲染資料是,需要使用userIcons。在modifyhost.vue元件mounted完成的時候,userIcons資料還沒有被初始化。導致modifyhost.vue渲染為空。

vuex中的state在元件中如何監聽?

思考

 想的是,當topo.vue中非同步獲取userIcons完成的時候,再去將modifyhost.vue元件中的userIcons初始化。這樣就會自動改變完成渲染。那麼怎麼知道非同步什麼時候完成呢?

 於是就想到了vue一個好東西watch監聽,監聽某一個資料的變化。我們都知道是,很容易監聽元件中區域性資料的變化。那麼,這裡怎麼去監聽state中的變化呢?於是有利用了computed計算屬性。具體操作如下:

解決

 在computed中寫一個計算屬性getUserIcons,返回狀態管理中的userIcons。然後在watch中監聽這個計算屬性的變化,對modifyhost.vue中的userIcons重新賦值。

computed: {
    getUserIcons() {
        return this.$store.state.topo.userIcons;
    }
},
watch: {
    getUserIcons(val) {
        this.userIcons = val;
    }
}複製程式碼

最終效果

vuex中的state在元件中如何監聽?

相關文章