使用 Vuex 在 Vue.js 中的计算属性上未从观察者更新数据变量

Posted

技术标签:

【中文标题】使用 Vuex 在 Vue.js 中的计算属性上未从观察者更新数据变量【英文标题】:data variable not being updated from watcher on computed property in Vue.js with Vuex 【发布时间】:2017-03-25 14:04:15 【问题描述】:

小提琴:https://jsfiddle.net/mjvu6bn7/

我有一个计算属性的观察者,它依赖于异步设置的 Vuex 存储变量。我正在尝试设置 Vue 组件的数据变量,当这个计算属性发生变化时,但这并没有发生。

这里是 Vue 组件:

new Vue(
  el: '#app',
  store,
  data : 
        myVar : ""

  ,
  beforeMount() 
        this.$store.dispatch('FETCH_PETS', 
        ).then(() => 
                    console.log("fetched pets")
        )

  ,
  computed:
      pets()
        return this.$store.state.pets
      
    ,
  watch:
    pets: (pets) => 
      console.log("Inside watcher")
      this.myVar = "Hey"
    
  
);

这里是 Vuex 商店:

const state = 
  pets: []
;

const mutations = 
  SET_PETS (state, response) 
        console.log("SET_PETS")
    state.pets = response;
  
;

const actions = 
 FETCH_PETS: (state) => 
      setTimeout(function()  
            state.commit('SET_PETS', ['t7m12qbvb/apple_9', '6pat9znxz/1448127928_kiwi'])
    , 1000)
 


const store = new Vuex.Store(
  state,
  mutations,
  actions
);

Here 是为此创建的小提琴。如您所见,myVar 没有更新,但是当宠物加载时会调用 watcher。

【问题讨论】:

【参考方案1】:

那是因为这不是你在内部函数中所期望的。

试试这个:

watch:
    var that = this;
    pets: (pets) => 
      console.log("Inside watcher")
      that.myVar = "Hey"
    

【讨论】:

这实际上是一个语法错误 - 你不能将变量声明放在对象文字中。【参考方案2】:

您错过了 ES6 箭头函数 do not bind the this keyword 的事实(箭头函数不仅仅是常规 function 的语法糖)。因此,在您的示例中,pets 观察程序中的 this 默认为 window 和 Vue 实例上的 myVar 永远不会设置。如果您按以下方式更改代码,则可以正常工作:

watch: 
    pets(pets) 
        console.log("Inside watcher")
        this.myVar = "Hey"
    

【讨论】:

以上是关于使用 Vuex 在 Vue.js 中的计算属性上未从观察者更新数据变量的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js:实例上未定义属性或方法

vuex使用方法

使用 vuex 和 vue 路由器的实例上未定义属性或方法“X”

vuex

vuex学习之路

Vuex ~ 专门为vue.js设计的集中式状态管理架构