Vue.js 为什么一个Vue实例使用数据更新,而另一个视图实例不使用';T

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

我是第一次使用Vue,对于为什么我的一个Vue对象在数据更改时不断更新而另一个Vue对象不会更新感到困惑

我有一个JavaScript模块,基本上只保存数据:

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