响应式丢失

42 阅读1分钟

响应式丢失

1.情景一:

 <div>
     {{city}}
     <button @click="add">添加城市</button>
 </div>
 ​
 <script setup>
     let city = reactive([])
     const add = () => {
       city = ['北京','上海','广州']
     }
 </script>

响应式丢失原因:地址指向了新的数组对象

修改方式一:使用push方法

 <div>
     {{city}}
     <button @click="add">添加城市</button>
 </div>
 ​
 <script setup>
     let city = reactive([])
     const add = () => {
       const newCity = ['北京','上海','广州']
       city.push(...newCity)
     }
 </script>

修改方式二:改用ref方式

 <div>
     {{city}}
     <button @click="add">添加城市</button>
 </div>
 ​
 <script setup>
     let city = ref([])
     const add = () => {
       city.value = ['北京','上海','广州']
     }
 </script>

修改方式三:改用对象方式

 <div>
     {{company.city}}
     <button @click="add">添加城市</button>
 </div>
 <script setup>
     let company = reactive({
       city: []
     })
 ​
     const add = () => {
       company.city = ['北京','上海','广州']
     }
 </script>

2.情景二

 <div>
     {{city}}
     <button @click="add">添加城市</button>
 </div>
 ​
 <script setup>
     let company = reactive({})
     let {city}  = toRefs(company)
     const add = () => {
       company['city'] = ['北京','上海','南京']
     }
 </script>
 ​

修改方式一:

 ​
 <div>
     {{city}}
     <button @click="add">添加城市</button>
 </div>
 ​
 <script setup>
     let company = reactive({})
     company['city'] = [] //必须要设置初始值,不然丢失响应式
     let {city}  = toRefs(company)
     const add = () => {
       company['city'] = ['北京','上海','南京']
     }
 </script>

修改方式二:

下面这种情况不用设置初始值,响应式不会丢失

 <div>
     {{company.city}}
     <button @click="add">添加城市</button>
 </div>
 ​
 <script setup>
     let company = reactive({})
     const add = () => {
       company['city'] = ['北京','上海','南京']
     }
 </script>
 ​

3.情景三

vue2中

 <template>
   <div>
     <p v-for="(item, index) in list" :key="index">{{item}}</p>
     <button @click="change">change</button>
   </div>
 </template>
 ​
 <script>
 export default {
   data(){
     return {
       list: [
         '张三',
         '李四',
         '王五',
       ]
     }
   },
   methods: {
     change() {
       this.list[0] = 'hsy';
       console.log('this.list[0]:' + this.list[0]);
     }
   }
 }
 </script>

解决方法:

 change() {
   // this.list[0] = 'hsy';
   this.$set(this.list, 0, 'hsy');
   //或者调用数组方法
   this.list.splice(0,1,'hsy');
   console.log('this.list[0]:' + this.list[0]);
 }