未在任何地方引用的 Vue 计算属性

Posted

技术标签:

【中文标题】未在任何地方引用的 Vue 计算属性【英文标题】:Vue computed property that isn't referenced anywhere 【发布时间】:2018-07-06 23:24:57 【问题描述】:

问题

如何创建一个虚拟的computed 属性,当它依赖的模型元素发生变化时将调用该属性,而不必说计算属性?

背景

我的父母是一些设置 ajax 查询参数的表单控件。当它们发生变化时,我需要从服务器获取数据,然后我 $emit 将新数据发送到子组件。

最初,我有一个名为updateTablemethod,它通过@change="updateTable()" 在每个元素上调用。

不喜欢将@change 添加到我所有的input 中,所以我创建了一个虚拟计算属性来利用自动依赖检测/重新计算。问题是 Vue 在我的情况下“太”聪明了,因为我实际上并没有在任何地方引用计算属性。一种解决方法是添加<div style="display:none">dummyProp</div>,但这似乎很老套。

我的模式错了吗?还是有更好的 Vue 方式来做到这一点?

【问题讨论】:

当模型元素依赖变化时会被调用这听起来像一只手表。 > "我将$emit 新数据传给子组件。"是的,这可能是错误的模式。为什么他们没有收到道具? 【参考方案1】:

您应该有一个computed 生成查询参数对象。当表单输入更改时,查询参数对象会更新。发送 ajax 请求的观察者,其回调更新我希望子组件的道具。

如果您的表单元素绑定到变量,那么无论如何您都不应该使用@change,您应该一直在观察变量——而且您会看到,因为computed 就是这样做的。

【讨论】:

这是个好主意...已经计算创建查询数据...并单独观察该变量。 我现在遇到的一个问题是我的计算属性没有在加载时触发...我猜在mounted 我可以修改计算属性所依赖的值,但这似乎哈克。 除了在您的观察者中之外,只需在 created 中进行 ajax 调用。【参考方案2】:

html 不需要引用您的计算属性来保持反应性。例如,您可以:

data: 
  return 
    inputA: 'A',
    inputB: 'B'
  
,
computed: 
  myProperty() 
    return this.inputA + this.inputB
  
,
methods: 
  callWithMyProperty() 
    ajaxFunction(this.myProperty)
  

每当您使用这样的模式调用callWithMyProperty 时,它将使用最新版本的inputAinputB。我假设您可能正在使用不同的(可能是非 Vue)模式,这导致了问题。

【讨论】:

以上是关于未在任何地方引用的 Vue 计算属性的主要内容,如果未能解决你的问题,请参考以下文章

Vue 允许在任何地方使用组件,而不仅仅是在#app

前端框架VUE----计算属性和侦听器

Vue 中未调用计算属性集

Vue 中未调用计算属性集

vue计算属性getter错误=> [Vue警告]:渲染错误:“TypeError:无法读取未定义的属性'periodNum'”[重复]

Vue计算属性未按预期工作[关闭]