Home  >  Article  >  Web Front-end  >  How to solve the problem that Vue cannot detect changes in arrays or objects?

How to solve the problem that Vue cannot detect changes in arrays or objects?

亚连
亚连Original
2018-06-04 16:32:152021browse

Below I will share with you an article that solves the problem that Vue cannot detect changes in arrays or objects. It has a good reference value and I hope it will be helpful to everyone.

Let’s look at an example:




 
 vue
 
 

  • {{item.name}} {{numbers[index]}}

The effect you want to achieve is to click li to see if vm.nymbers[index] exists, and there is no setting. is 1, plus 1 if present.

After clicking, the number was not updated in the view layer. However, it was found through console printing that the data was updated, but the view layer did not detect it in time.

Look at another change:




 
 vue
 
 

  • {{item.name}}

You can see that the view layer here can be updated in time, but why can't it be done when it comes to the array?

Let’s take a look at the official documentation of Vue2.0:

Due to JavaScript limitations, Vue cannot detect the following changed arrays:

When you use the index to directly set an item, for example: vm.items[indexOfItem] = newValue

When you modify the length of the array, for example: vm.items.length = newLength

In order to solve the first type of problem, the following two methods can achieve the same effect as vm.items[indexOfItem] = newValue, and will also trigger status updates:

// Vue.set 
Vue.set(example1.items, indexOfItem, newValue)
// Array.prototype.splice 
example1.items.splice(indexOfItem, 1, newValue)

You can also use vm.$ set instance method, which is just an alias for the global Vue.set.

Or due to JavaScript limitations, Vue cannot detect the addition or deletion of object properties:

var vm = new Vue({
 data: {
 a: 1
 }
})
// `vm.a` 现在是响应式的
vm.b = 2
// `vm.b` 不是响应式的

For already created instances, Vue cannot dynamically add root-level responsive properties. However, you can add reactive properties to nested objects using the Vue.set(object, key, value) method. For example, for:

var vm = new Vue({ 
 data: { 
 userProfile: { 
  name: 'Anika' 
 } 
 } 
})

Sometimes you may need to assign multiple new properties to an existing object, such as using Object.assign() or _.extend(). In this case, you should create a new object with the properties of both objects. So, if you want to add a new reactive attribute, instead of doing it like this:

Object.assign(this.userProfile, { 
 age: 27, 
 favoriteColor: 'Vue Green' 
})

you should do this:

this.userProfile = Object.assign({}, this.userProfile, { 
 age: 27, 
 favoriteColor: 'Vue Green' 
})

Therefore, the above example should be changed to :




 
 vue
 
 

  • {{item.name}} {{numbers[index]}}

Done!

1.17 Supplement----------------------------------

How to understand "Vue cannot dynamically add root-level responsive properties to already created instances"?

For example:

var vm=new Vue({ 
 el:'#test', 
 data:{ 
  //data中已经存在info根属性 
  info:{ 
   name:'小明' 
  } 
 } 
}); 
//给info添加一个性别属性 
Vue.set(vm.info,'sex','男');

The above is the correct approach, but if you do the following, an error will be reported:

Vue.set(vm.data,'sex','男')

Actually , you cannot directly add attributes to data, but you can add attributes to objects in data.

Actually vm.data is undefined.

The above is what I compiled for everyone. I hope it will be helpful to everyone in the future.

Related articles:

NodeJS parent process and child process resource sharing principles and implementation methods

Vue mobile phone number, email regular verification And an example of sending verification code in 60s

Vue implements active click switching method

The above is the detailed content of How to solve the problem that Vue cannot detect changes in arrays or objects?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn