vue3: ref, reactive, readonly, shallowReactive

vue3: ref, reactive, readonly, shallowReactive

原文地址:https://mp.weixin.qq.com/s/S3jPZKEMBP8nQQObF5d2VA

javascript 复制代码
<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>
相关推荐
古时的风筝2 分钟前
花10 分钟时间,把终端改造成“生产力武器”:Ghostty + Yazi + Lazygit 配置全流程
前端·后端·程序员
Cache技术分享3 分钟前
340. Java Stream API - 理解并行流的额外开销
前端·后端
我叫黑大帅15 分钟前
前端如何利用 GitHub Actions 自动构建并发布到 GitHub Pages?
前端·面试·github
smallLabel18 分钟前
记一次 OpenClaw 飞书插件接入填坑指南: Error: spawn EINVAL
前端
zzjyr20 分钟前
react前端项目 fetch原生 与 umijs request 四种请求区别
前端
我叫黑大帅21 分钟前
前端总说的防抖与节流到底是什么?
前端·javascript·面试
小时前端21 分钟前
微信小程序选不了本地文件?用 web-view + H5 一招搞定
前端·微信小程序·uni-app
71Ove21 分钟前
告别手写字符串!UniApp 路由全自动类型生成工具
前端
掘金安东尼23 分钟前
从平面到空间:用 React Three Fiber 构建 3D 产品网格
前端·javascript·面试
小时前端23 分钟前
HTTPS 页面加载 HTTP 脚本被拦?同源代理来救场
前端·https