背景:在vue開發中會遇到data數據更改后view試圖不會進行響應式更新的情況
以下4種情況不觸發vue響應式更新!!
不能檢測到的數組變動是:
1、當利用索引直接設置一個項時,例如:vm.items[indexOfItem] = newValue;
2、當修改數組的長度時,例如:vm.items.length = newLength;
不能檢測到的對象變動是:
3、向響應式對象添加屬性;
4、向響應式對象刪除屬性;
解決方案:
demo:
<template> <div class="hello"> <div v-for="(item,index) in students" :key="index"> <span>姓名:{{item.name}} </span> / <span>年齡:{{item.age}}</span> / <span>索引:{{index}}</span> </div> <hr> <span v-for="(prop,index) in oneTeacher" :key="index"> {{prop}} / </span> <hr> <p><button @click="changeArr()">點擊正常修改對象屬性</button></p> <p>視圖無響應: <button @click="indexChangeProp()">點擊使用索引修改數組內容</button> <button @click="lengthChangeProp()">點擊更改對象length數組長度</button> <button @click="addProp()">點擊向響應式對象添加屬性</button> <button @click="deleteProp()">點擊向響應式對象刪除屬性</button> </p> <hr> <p>對應解決方法: <button @click="changeArr()">js完全替換掉數組</button> <button @click="methodsChangeArr()">使用JavaScript方法可以獲取修改后返回的新數組</button> <button @click="setChangeprop()">使用vue的set方法向響應式對象添加屬性</button> <button @click="deletChangeprop()">使用vue的delete方法向響應式對象刪除屬性</button> <button @click="assignChangeprop()">使用JS的Object.assign({},o1,o2)方法向對象添加屬性</button> </p> </div> </template> <script> export default { name: 'HelloWorld', data () { return { msg: 'Welcome to Your Vue.js App', students:[ {name:"張三",age:27}, {name:"李四",age:29} ], oneTeacher:{name:"諸葛孔明",age:1000} } }, methods:{ //該函數中直接進行了數組替換,大量數據處理時不合適 changeArr:function(){ let that=this; that.students=[ {name:"張三",age:18}, {name:"李四",age:18} ] }, //根據索引修改數組對象,視圖沒有更新 indexChangeProp:function(){ let that=this; that.students[0]={name:"王五",age:33}; console.log(that.students); }, //改變數組長度,視圖沒有更新 lengthChangeProp:function(){ let that=this; that.students.length=5; console.log(that.students); }, //向響應式對象添加屬性,視圖沒有更新 addProp:function(){ let that=this; that.oneTeacher.studentNum=100; console.log(that.oneTeacher); }, //向響應式對象刪除屬性,視圖沒有更新 deleteProp:function(){ let that=this; delete that.oneTeacher.age; console.log(that.oneTeacher); }, //使用JavaScript的數組方法獲取返回的數組 methodsChangeArr:function(){ let that=this; let newStudent={name:"小喬",age:16}; that.students.push(newStudent); console.log(that.students); }, //使用vue的set方法向響應式對象添加屬性 setChangeprop:function(){ let that=this; that.$set(that.oneTeacher,"studentNum","200個學生"); console.log(that.oneTeacher); }, //使用vue的delete方法向響應式對象刪除屬性 deletChangeprop:function(){ let that=this; that.$delete(that.oneTeacher,"age"); console.log(that.oneTeacher); }, //assign()方法合並多個對象返回新的對象進而達到添加對象屬性的效果 assignChangeprop:function(){ let that=this,obj1,newObj; obj1={sex:"男"}; //newObj=Object.assign(that.oneTeacher,obj1); //無效,並未替換原有對象 newObj=Object.assign({},that.oneTeacher,obj1); that.oneTeacher=newObj; console.log(that.oneTeacher); }, } } </script>
解決方法總結:
1、創建新的數組替換原有數組值
2、使用JavaScript的數組操作函數,這些方法都會返回一個新數組,也是數組替換原理;
3、使用vue自帶的 vue.set(object , key , value );?向響應式對象添加屬性;
4、使用vue自帶的 vue.delete(object , key );?向響應式對象刪除屬性;
5、對象添加屬性還可以使用Object.assign({},obj1,obj2)返回獲取的新對象替換原有對象;
附加能監聽到的:
- push() - pop() - shift() - unshift() - splice() - sort() - reverse()