当前位置: 首页 > 知识库问答 >
问题:

Vue 2 Vuex:在计算属性中使用状态变量

锺离嘉茂
2023-03-14

我有一个Vuex实例,其中包含两个变量:

const store = new Vuex.Store({
  state: {
    start_date: moment().startOf('year').format("MM/DD/YYYY"),
    end_date: moment().format("MM/DD/YYYY")
  },
  mutations: {
    changeDate(state, date_obj) {
      state.start_date = date_obj.start_date
      state.end_date = date_obj.end_date
    }
  }
})

我有我的主Vue实例,其中日期属性是从store继承的:

var employees = new Vue({
  el: '#employees',
  computed: {
    start_date() {
      return store.state.start_date
    },
    end_date() {
      return store.state.end_date
    },
    leads() {
      let filter_obj = {
        start_date: this.start_date,
        end_date: this.end_date
      }
      return this.fetch('potential_clients', filter_obj)
    }
  },
  methods: {
    fetch(model, args=null) {
      return new Promise((resolve, reject) => {
        console.log(resolve, reject)
        let url = "/" + model + ".json"
        console.log(url);
        $.ajax({
          url: url,
          data: args,
          success: ((res) => {
            console.log(res)
            this[model] = res;
            resolve(res)
          }),
          error: ((res) => {
            reject(res)
          }),
          complete: (() => {})
        })
      })
    }
  },
  mounted() {
    this.fetch('potential_clients')
  }
});

我最初称之为。fetch('potential_clients')不带任何额外参数,但是一旦start_dateend_date的值更改,我想调用上面的leads()之类的函数。但是,当我更改开始日期结束日期的值时,没有任何变化。

可能值得注意的是,当我使用Vue插件在Chrome中进行检查,并单击根组件时,视图中会突然显示更改?很奇怪

共有1个答案

杨昆
2023-03-14

对Vue实例范围之外的变量的任何引用都不会是被动的。这意味着您正在引用的存储对象不是被动的。

您需要引用Vue实例对store的内部引用(this.$store),它是反应性的:

start_date() {
  return this.$store.state.start_date
},

这是假设您已在根Vue实例的配置对象中传递了存储(在您的示例中,它似乎是#employees组件):

var employees = new Vue({
  el: '#employees',
  store: store,
  ...
 类似资料:
  • 本文向大家介绍Vue计算属性的使用,包括了Vue计算属性的使用的使用技巧和注意事项,需要的朋友参考一下 我们都知道在Vue构造函数的参数对象中有一个【data】属性,该属性值是一个对象,该对象是对数据的代理,是一个键值对并且时刻与页面表现是一致的,但是这里面只能是简单的键值对,不能拥有业务逻辑,并且由于【data】中的属性属于同一个生命周期,所以如果我们需要某一个属性是依赖于另外一个属性时,在【d

  • index.html 中通过点击按钮每次 随机更新 post的id属性值。 而post对象被 v-bind 到 子组件home-tag的 props中的id和title属性中。 home-tag子组件中存在计算属性normalizedId 依赖于props的id属性。 因此 理论上每次 点击 post的id的更新会导致normalizedId 的值一起变化。 问题: 实际运行 normalized

  • 问题 你想将一个只读属性定义成一个property,并且只在访问的时候才会计算结果。 但是一旦被访问后,你希望结果值被缓存起来,不用每次都去计算。 解决方案 定义一个延迟属性的一种高效方法是通过使用一个描述器类,如下所示: class lazyproperty: def __init__(self, func): self.func = func def __ge

  • 主要内容:实例 1,实例 2,computed vs methods,实例 3,computed setter,实例 4计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1 <div id="app"> {{ message.split('').reverse().join('') }} </div> 实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2 <div id="app">

  • 主要内容:实例 1,实例 2,computed vs methods,实例 3,computed setter,实例 4计算属性关键词: computed。 计算属性在处理一些复杂逻辑时是很有用的。 可以看下以下反转字符串的例子: 实例 1 <div id="app"> {{ message.split('').reverse().join('') }} </div> 实例 1 中模板变的很复杂起来,也不容易看懂理解。 接下来我们看看使用了计算属性的实例: 实例 2 <!DOCTYPE html

  • 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。例如: <div id="example"> {{ message.split('').reverse().join('') }} </div> 所以,对于任何复杂逻辑,你都应当使用计算属性。在这个地方,模板不再是简单的声明式逻辑。你必须看一段时间才能意识到,这里是想要显示变量messa