Vuex getter 不会更新

Posted

技术标签:

【中文标题】Vuex getter 不会更新【英文标题】:Vuex getter will not update 【发布时间】:2017-12-24 11:24:00 【问题描述】:

我正在使用日期选择器来设置 moment.js 日期,该日期正在我的 Vuex 商店中设置:

存储状态:

const state = 
    arrival: '',
    departure: ''

吸气剂:

const getters = 
    arrival: state => state.arrival,
    departure: state => state.departure,

    prettyArrival: (state) => 
        if (state.arrival instanceof moment) 
            return state.arrival.format(state.prettyFormat);
        

        return '';
    

我的 vuex 商店正在正确更新到达状态(这是一个 moment.js 对象),因为我可以清楚地看到显示更新和原始状态更改的开发工具。

但 prettyArrival 没有正确更新。仅当到达从空字符串变为moment.js 对象时才设置一次。

我的到达 getter 在 devtools 中显示如下:

arrival:"2017-07-21T09:15:53.770Z"

当我记录它时,我得到了 moment.js 对象,虽然它似乎包含 reactiveGettersreactiveSetters,所以反应似乎就位。

是我设置 getter 的方式有问题还是这里有其他问题?

欢迎任何提示,如果您需要更多信息,请告诉我。

【问题讨论】:

prettyArival is not updating at all (..) it is only being set once 是什么意思。那么它正在更新吗?在此方法和 if 语句中调试(或至少放置日志语句)。在数据中,您说默认值为空字符串,但随后您传递了 moment 对象 - 我似乎不正确,但这可能是一个小问题。 @AndreyPopov 在 getter 中使用 consolg.log 时,它似乎只第一次调用了 prettyArrival getter,然后它再次抓住调用它。我猜它与缓存有关:a getter's result is cached based on its dependencies, and will only re-evaluate when some of its dependencies have changed. 但我不知道这是如何在内部工作的。 尝试将默认值改为。还要为这个 getter 添加计算属性 - 它可能会强制它重新计算 ;) 您的代码与这个工作示例有何不同? jsfiddle.net/hk9oy0br/1 【参考方案1】:

解决方案在于这个答案:

Why does vue.js not update the dom with datepicker using moment.js

我认为情况并非如此,因为我仍然有几个输入正在正确更新。我是如何让它工作的仍然是一个我需要解决的谜。

moment.js 实例不是响应式的,因此您可以通过将 moment.js 实例扔到构造函数中来修复它,并在每次设置时创建一个新实例:

moment(this.currentDate)

this.currentDate 在这种情况下是一个 moment.js 实例。

【讨论】:

以上是关于Vuex getter 不会更新的主要内容,如果未能解决你的问题,请参考以下文章

监听getter的Vuex计算属性不更新

Vuex getter 未更新

Vuex getter无法更新状态更改

如何在 Vue 自定义中间件中获取 Vuex 更新的 getters 值以进行权限检查?

使用 vuex getter 重新渲染组件

如何在Vuex的getter函数中调用getter函数