vue3 中 使用reactive,数组没有响应

内容来自于: https://vue3.chengpeiquan.com/component.html#变量的读取与赋值-1

如果你使用常规的重置,会导致这个变量失去响应性:

 1 /** 
 2  * 不推荐使用这种方式
 3  * 异步添加数据后,模板不会响应更新
 4  */
 5 let uids: number[] = reactive([ 1, 2, 3 ]);
 6 
 7 // 丢失响应性的步骤
 8 uids = [];
 9 
10 // 异步获取数据后,模板依然是空数组
11 setTimeout( () => {
12   uids.push(1);
13 }, 1000);

 

要让模板那边依然能够保持响应性,则必须在关键操作时,不破坏响应性 API 的存在。

 1 /** 
 2  * 不推荐使用这种方式
 3  * 异步添加数据后,模板不会响应更新
 4  */
 5 let uids: number[] = reactive([ 1, 2, 3 ]);
 6 
 7 // 不会破坏响应性
 8 uids.length = 0;
 9 
10 // 异步获取数据后,模板可以正确的展示
11 setTimeout( () => {
12   uids.push(1);
13 }, 1000);

 

特别注意

不要对通过 reactive 定义的对象进行解构,解构后得到的变量会失去响应性。

比如这些情况,在 2s 后都得不到新的 name 信息:

 1 import { defineComponent, reactive } from 'vue'
 2 
 3 interface Member {
 4   id: number,
 5   name: string
 6 };
 7 
 8 export default defineComponent({
 9   setup () {
10 
11     // 定义一个带有响应性的成员对象
12     const userInfo: Member = reactive({
13       id: 1,
14       name: 'Petter'
15     });
16 
17     // 2s后更新userInfo
18     setTimeout( () => {
19       userInfo.name = 'Tom';
20     }, 2000);
21 
22     // 这个变量在2s后不会同步更新
23     const newUserInfo: Member = {...userInfo};
24 
25     // 这个变量在2s后不会再同步更新
26     const { name } = userInfo;
27 
28     // 这样return出去给模板用,在2s后也不会同步更新
29     return {
30       ...userInfo
31     }
32   }
33 })

 

 

posted @ 2022-07-09 09:05  googlegis  阅读(2107)  评论(0编辑  收藏  举报

坐标合肥,非典型GIS开发人员 GitHub