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 })