vue3: ref, reactive, readonly, shallowReactive
原文地址:https://mp.weixin.qq.com/s/S3jPZKEMBP8nQQObF5d2VA
<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>