javascript – 在计算属性中使用条件逻辑无法更新

我有两个小提琴:A,B(使用Vuejs 2.2.4)

我有一个可以通过编程方式更改的计算属性(我正在使用get和set方法).

期望:

>如果认参数更改(this.message),则必须更改计算属性(computedMessage)(认行为).
>如果辅助参数发生更改(this.messageProxy),则只有计算属性必须反映辅助参数.

小提琴A按预期工作但小提琴B没有.

错误:辅助参数更改后,认行为(第1点)停止.

fiddles之间的唯一区别是计算属性中的控制台语句.

背景:我试图以编程方式设置计算属性.计算属性设置如下:

computedMessage: {
  get () {
    let messageProxy = this.messageProxy
    this.messageProxy = null
    console.log(messageProxy,this.messageProxy,this.message)
    return messageProxy || this.message
  },set (val) {
    this.messageProxy = val
  }
}

这允许我设置computedMessage的值,如:

this.computedMessage = 'some string'

如果这些行:

get () {
  let messageProxy = this.messageProxy
  this.messageProxy = null
  return messageProxy || this.message
}

被替换为:

get () {
  return this.messageProxy || this.message
}

那么在设置this.messageProxy时,computedMessage就无法再访问this.message了.

通过将this.messageProxy设置为null,我确保了

computedMessage = this.messageProxy

只有在作出任务时.

最佳答案
return语句中对this.message的引用不会触发computedMessage进行更新.这是因为它在逻辑||中的位置声明使其无法访问.这是Vue.js Computed Properties Documentation中记录的问题.

来自Docs:

status: function () {
    return this.validated
        ? this.okMsg
        : this.errMsg // errMsg isn't accessible; won't trigger updates to status
}

解决方法是显式访问依赖项:

status: function () {
    // access dependencies explicitly
    this.okMsg
    this.errMsg
    return this.validated
        ? this.okMsg
        : this.errMsg
}

因此,在您的示例中添加对this.message的引用:

get() {
  this.message
  let messageProxy = this.messageProxy
  this.messageProxy = null
  return messageProxy || this.message
}

您的第一个小提琴按预期工作的原因是因为console.log调用将this.message作为参数.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...