Vue.js 为什么一个Vue实例使用数据更新,而另一个视图实例不使用';T
我是第一次使用Vue,对于为什么我的一个Vue对象在数据更改时不断更新而另一个Vue对象不会更新感到困惑 我有一个JavaScript模块,基本上只保存数据:Vue.js 为什么一个Vue实例使用数据更新,而另一个视图实例不使用';T,vue.js,Vue.js,我是第一次使用Vue,对于为什么我的一个Vue对象在数据更改时不断更新而另一个Vue对象不会更新感到困惑 我有一个JavaScript模块,基本上只保存数据: var MyModule = (function(){ const info = { requestCount: 20, arrayOfItems: [] } return info; })(); 我有这个html: <span id='requestCounter' c
var MyModule = (function(){
const info = {
requestCount: 20,
arrayOfItems: []
}
return info;
})();
我有这个html:
<span id='requestCounter' class='badge'>{{count}}</span>
<table id='vueTable'><tr v-for="item in items"><td>{{item.description}}</td></tr></table>
在第一次演练中,一切都按预期进行。更改MyModule.arrayOfItems的MyModule.arrayOfItems
工作正常,表会根据阵列中的内容进行更新。但是,更改MyModule.requestCount
没有任何作用。有人能告诉我我做错了什么吗
(注意,简化了我的示例以简化我的问题)您正在从MyModule初始化Vue对象中的数据。这不会使MyModule成为正确的存储或控制器。奇怪的行为不是
requestCount
没有反应,而是arrayOfItems
有反应
数组的行为之所以如此,是因为对象是通过引用传递的,因此当您初始化项时,Vue会抓住实际的数组对象,并对其施展魔法。实际上,MyModule为您的Vue数据提供了一个外部句柄
另一方面,requestCount
是一个简单的值,而不是对象,因此它是按值传递的,并且MyModule中的成员与requestCounterVue
中的数据项之间绝对没有关系。您正在从MyModule初始化Vue对象中的数据。这不会使MyModule成为正确的存储或控制器。奇怪的行为不是requestCount
没有反应,而是arrayOfItems
有反应
数组的行为之所以如此,是因为对象是通过引用传递的,因此当您初始化项时,Vue会抓住实际的数组对象,并对其施展魔法。实际上,MyModule为您的Vue数据提供了一个外部句柄
另一方面,requestCount
是一个简单的值,而不是对象,因此它是按值传递的,MyModule中的成员与requestCounterVue中的数据项之间绝对没有关系。我把这个放在这里是因为他回答的时候我正在打字,可能再多解释也无妨
MyModule
不会因为您使用它初始化VUE中的值而变得被动。我想之所以arrayOfItems
能以您所期望的方式工作,是因为您实际上并没有将其设置为新数组,而是在对现有数组进行变异
例如,此处定义了使用阵列的Vue
var mainTable = new Vue({
el: '#vueTable',
data: {
items: MyModule.arrayOfItems
}
});
如果像这样向MyModule.arrayOfItems添加值
MyModule.arrayOfItems.push('my new value')
MyModule.arrayOfItems = ['my','new','array']
然后,您的Vue将显示新值。这是因为mainTable.items
和MyModule.arrayOfItems
是指向同一数组的指针
但是,如果您改为这样修改MyModule.arrayOfItems
MyModule.arrayOfItems.push('my new value')
MyModule.arrayOfItems = ['my','new','array']
然后,mainTable
将不显示更新的数组。这是因为您已将其更改为完全不同的数组。换句话说,MyModule.arrayOfItems!==mainTable.items
这也是将MyModule.count
更改为新值不会反映在requestCounterVue
中的原因MyModule.count
是一个基本值,当您使用count
初始化requestCounterVue
时,它使用该值的一个副本,并使该副本成为被动副本。更改MyModule.count
将无效
如果希望看到反映的更改,可以这样初始化VUE
var mainTable = new Vue({
el: '#vueTable',
data: MyModule
});
当Vue被实例化时,MyModule
将变成一个反应对象,并且对count
和arrayOfItems
的更改都会反映出来,Roy是完全正确的。我把这个放在这里是因为他回答的时候我正在打字,可能再多解释也无妨
MyModule
不会因为您使用它初始化VUE中的值而变得被动。我想之所以arrayOfItems
能以您所期望的方式工作,是因为您实际上并没有将其设置为新数组,而是在对现有数组进行变异
例如,此处定义了使用阵列的Vue
var mainTable = new Vue({
el: '#vueTable',
data: {
items: MyModule.arrayOfItems
}
});
如果像这样向MyModule.arrayOfItems添加值
MyModule.arrayOfItems.push('my new value')
MyModule.arrayOfItems = ['my','new','array']
然后,您的Vue将显示新值。这是因为mainTable.items
和MyModule.arrayOfItems
是指向同一数组的指针
但是,如果您改为这样修改MyModule.arrayOfItems
MyModule.arrayOfItems.push('my new value')
MyModule.arrayOfItems = ['my','new','array']
然后,mainTable
将不显示更新的数组。这是因为您已将其更改为完全不同的数组。换句话说,MyModule.arrayOfItems!==mainTable.items
这也是将MyModule.count
更改为新值不会反映在requestCounterVue
中的原因MyModule.count
是一个基本值,当您使用count
初始化requestCounterVue
时,它使用该值的一个副本,并使该副本成为被动副本。更改MyModule.count
将无效
如果希望看到反映的更改,可以这样初始化VUE
var mainTable = new Vue({
el: '#vueTable',
data: MyModule
});
当Vue被实例化时,MyModule
将变成一个反应对象,并且变化将反映在count
和arrayOfItems
中