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

如何更新反应式对象(以及一般的属性)?

公子昂
2023-03-14

Vue.js关于深度反应性的文档提到

数据对象中必须存在一个属性,以便Vue转换该属性并使其具有反应性

(...)

您必须通过预先声明所有根级反应性数据属性来初始化Vue实例,即使只是使用空值

考虑这两个代码片段,其中标记被定义为空对象,并在脚本过程中以两种不同的方式进行更新:

var vm = new Vue({
  el: "#root",
  data: {
    tags: {}
  }
});

vm.tags = {
  hello: true,
  world: true
};
html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.js"></script>
<div id="root">
  {{tags}}
</div>
var vm = new Vue({
  el: "#root",
  data: {
    tags: {}
  }
});

vm.tags["hello"] = true
vm.tags["world"] = true
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.3.3/vue.js"></script>
<div id="root">
  {{tags}}
</div>

在第一种情况下,内容被正确更新,而在第二种情况下,内容没有被正确更新。

为什么会这样,尽管在这两种情况下标签都是在VM实例化时声明的?

共有2个答案

夏侯英纵
2023-03-14

这是因为在第一种情况下,您正在<code>标签数据:{tags:{定义中,因此它们不是被动的。

留档中的更改检测警告部分涵盖了这一点,但与您的情况(嵌套属性情况)不完全相同。您必须像这样声明您的数据:

data: {
  tags: {
    hello: null,
    world: null,
  }
}
孙财
2023-03-14

这并不是说标签对象是声明的,而是当 Vue 实例化时,tags 对象的属性不存在。

在第二种情况下,您使用索引器将两个新属性添加到标记对象。Vue无法检测到已添加这些属性。

这就是为什么<code>$set<code>方法存在的原因。向对象添加新属性时,需要通过$setVue.set添加它

 Vue.set(vm.tags, 'hello', true)

或者,如果您在Vue方法中,

this.$set(this.tags, 'hello', true)

在第一种情况下,您将添加一个具有属性的完全不同的对象。在这种情况下,Vue知道这些属性,并在向数据添加新值时将它们转换为反应属性。

相反,如果您添加了一个新的空对象,然后添加了属性,则您将返回到与第二个示例相同的大小写中。

通常,您只想使用空属性初始化对象。

data: {
    tags:{
        hello: false,
        world: false
    }
}

在这种情况下,属性将被转换为反应属性,并且将检测到变化。

编辑

@WoJ用笔发表了一条评论,代码如下所示:

var vm = new Vue({
  el: "#root",
  data: {
    posts: {},
    tags: {}
  }
});

vm.tags = {
  hello: true,
  world: true
};

vm.posts["bonjour"] = true
vm.posts["monde"] = true
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.10/vue.min.js"></script>
<div id="root">
  <!-- show all tags which are on -->
  {{tags}}
  {{posts}}
</div>
 类似资料:
  • 我在JS对象(不是数组)中有一个

  • 上次分析了背后的一些原因,这次说说如何应对 首先这里默认没有任何挽回机会了,而不是你跪在女神面前大哭一场,或作出一哭二闹三上吊这种夸张的事情便可力挽狂澜的 如果你真做了,并且挽回了,那么请参考如何恋爱的番外,而非下文 对于个体而言,如何尽快走出困境,把损失降到最低,这是我们现在最为关心的 好,我们先来处理《黄帝内经》中着重强调的“治未病”阶段 首先,要正视自己的备胎身份 大多数人往往不愿意承认这个

  • 问题内容: 我有一个像这样的JSON字符串: 我想将属性更新为,如果值为,并且值为。 我已经到了这一点,但是不确定如何进行: 我不知道怎么去的是一个孩子。 提前致谢。任何指针都很棒。 问题答案: 您可以使用属性作为键来访问对象: 对于您的示例,请尝试:

  • 问题内容: 我想在Qml中显示一个矩形,并且想从我的python代码中更改矩形的属性(宽度,长度)。实际上,在python代码中有一个套接字连接,通过该套接字连接可以从另一台计算机接收width和length的值。简而言之:另一个用户应该能够实时调整此矩形。我知道如何在我的python文件中建立套接字连接,并使用PyQt5,我可以显示来自python的qml文件。 但是,我在通过python代码访

  • 问题内容: 我有一个具有多个相关属性的类,例如: 如果我正常地制作一个对象,那没有问题, 我将得到2个列表,和。 现在,如果我想先创建一个空对象,并为其分配一个属性,则希望其他属性自动更新,例如 我想自动更新,也想自动更新(分配和自动更新)。这可能吗? Class 是否是正确的选择? 谢谢大家,但是所有其他答案让我完全不知所措。谁能提供一个完整的解决方案,让我可以学习编写自己的解决方案? 我想实现