vue3: ref, reactive, readonly, shallowReactive

<template> <!-- <ul> <li v-for="item in list.arr">{{item}}</li> </ul> <button @click.prevent="add">添加</button> --> <!-- <button @click.prevent="show">查看</button> --> <div>{{ obj2 }}</div> <button @click.prevent="edit">修改</button> </template> <script setup lang='ts'> import { ref, reactive, readonly, shallowReactive } from 'vue'; /* ref:支持所有类型;取值/赋值都需加.value,reactive不需要。 reactive:支持引用类型 Array Object Map Set;由proxy代理,不能直接赋值,否则会破坏响应式对象; 解决方案:可以使用数组push加解构;或者添加一个对象,把数组作为一个属性去解决 ; readonly:属性不可修改。会受到原始对象的影响,原始对象改变readonly声明的属性也会改变 shallowReactive:声明的数据浅层次响应式数据,数据改变视图不会更新;修改对象最顶层属性, 数据改变视图会发生更新。 reactive,shallowReactive 两者不可同时使用写在一起,否则ref影响成shallowRef视图更新; 影响原因:ref 底层会调用 triggerRef; triggerRef会强制更新收集的依赖。 */ let obj=reactive({name:"小满"}); const obj2:any=shallowReactive({ foo:{ bar:{ num:1 } } }); const edit= ()=> { // 浅层次响应式数据,数据改变视图不会更新 // obj2.foo.bar.num=456 // 浅层次响应式数据,修改对象最顶层属性foo,数据改变视图会发生更新 obj2.foo={name:"小田"} console.log(obj2); } // let obj=reactive({name:"小田"}); // // 属性不可修改 // const read=readonly(obj); // const show = () => { // obj.name="大田" // console.log("obj:",obj); // console.log("read:",read); // } // let list=reactive<String[]>([]); let list=reactive<{ arr:String[] }>({ arr:[] }); const add = () => { setTimeout(()=>{ let res=["EDG","RNG","JDG"] // //方案1: 使用数组push加解构 // list.push(...res); // 方案2:添加一个对象,把数组作为一个属性去解决 list.arr=res; },500); console.log(list); } </script> <style scoped> </style>
上一篇:【eNSP】路由基础与路由来源——静态路由实验-二、静态路由