当前位置: 首页 > news >正文

学习vue3第五节(reactive 及其相关)

1、定义

reactive() 创建一个响应式代理对象,不同于ref()可以创建任意类型的数据,而reactive()只能是对象,会响应式的深层次解包任何属性,将其标注为响应式
响应式是基于ES6的proxy实现的代理对象,该proxy对象与原对象是不相等的;

<script setup>import { reactive, onMounted } from 'vue'const baseObj = {job:'搬砖', love: '象棋'}const person = reactive(baseObj)onMounted(() => {console.log('----', baseObj === person) // false})</script>

2、reactive() 创建对象 数组更新数据时;

a、创建的是对象时,
若将对象全部赋值,会导致数据变了,而页面没有更新,因为全部赋值破坏了代理指向,从而导致不是原来使用reactive()创建的对象了;需要一个一个属性的赋值;

<script setup>
import { reactive } from 'vue'let person = reactive({job: '躺平',love: '跑步'})let per2 = reactive({job: '搬砖',love: '跑步'})const handleChangeJOb = () => {person = {}console.log('===', person) // {} ;值更新了,但是视图却没有更新per2.job = per2.job + '&' // '搬砖&' 值更新了,视图同样更新// 这样清空数据,才会让界面跟着同步更新// Object.keys(per2).forEach(itm => {//   per2[itm] = ''// })// console.log('=22=per2==', per2)}
</script>

b、操作数组时,
直接给响应式数组 赋值为空数组[],页面不会更新,需要将数组的length赋值为0才可以更新视图;此处与vue2中刚好相反

<script setup>let myArr = reactive([{ name: '张三', age: '26' },{name: '李四', age: '18'}])const handleChangeArr = () => {// myArr = [] // 页面视图不更新,得到的是普通数组对象,// console.log('==myArr=', myArr) myArr.length = 0 // 页面会同步更新,得到的是proxy代理对象console.log('==myArr=', myArr)myArr.push({ name: '马六', age: '16'})// 使用原生数组方法,进行数据操作时,同样可以更新视图,// 相比较vue2 中只重写了7中数组方法,要方便的多}
</script>

3、reactive() 使用时注意事项

<script setup>// 尽量扁平化,避免多层嵌套let per1 = reactive({data: {name: '王五'}})// 建议如下:let perData = reactive({name: '王五'})// 若定义的对象有多层嵌套,需要使用ref 或者 toRefs 来保持响应式let pData = reactive({person: {name: '马超',job: '大将军'},})// 以下均可可以更新视图pData.person = {name: '关羽', job: '上将军'} pData.person.name = '关羽' const { person } = pDataperson.name = '关羽2'// 使用toRefsconst personRef = toRefs(pData)console.log('=00==personRef==', personRef) // 视图更新数据变化

console.log(‘=00personRef’, personRef) 出来的是 为 ObjectRefImpl 对象
截图:
在这里插入图片描述

4、shallowReactive() 创建浅层的响应式

,这里没有深层级的转换:一个浅层响应式对象里只有根级别的属性是响应式的。属性的值会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。即第一级是响应式的,之后的属性是非响应式的

<script setup>import { shallowReactive } from 'vue'let personO = shallowReactive({name: 'Andy',others: {like: '躺平'}})const handleChangePerson = () => {// personO.name = 'Andy 3号' // 是响应式的,界面视图会更新personO.others.like = '梦想在哪里' // 非响应式的,界面不会更新console.log('====', isReactive(personO.others)) // false
}</script>

5、isReactive() 是用于 检查一个对象是否是由 reactive() 或 shallowReactive() 创建的代理。返回的是一个布尔值

相关文章:

  • 计算机原理
  • 面试官:你说说Kafka是怎么保证消息可靠性的
  • 网络原理(3)——TCP协议
  • vue 中 清除form 校验状态
  • 关于继承是怎么样的?那当然是很好理解之
  • 解决Linux中Eclipse启动时找不到Java环境的问题
  • vue+elementUI实现指定列的单元格可编辑
  • 【09】进阶JavaScript事件循环Promise
  • C语言救赎之路,有些鸟儿是困不住的!(其4) (逻辑运算符+函数)
  • SpringCloudGateway之限流集成篇
  • 数据库笔记
  • 【Godot4.2】颜色完全使用手册
  • 第二十七节 Java 多态
  • Swift 从获取所有 NSObject 对象聊起:ObjC、汇编语言以及底层方法调用链(一)
  • Git版本管理工具
  • 网络传输文件的问题
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 【前端学习】-粗谈选择器
  • C++类的相互关联
  • ECMAScript6(0):ES6简明参考手册
  • extract-text-webpack-plugin用法
  • HTTP那些事
  • java中的hashCode
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Quartz初级教程
  • SAP云平台里Global Account和Sub Account的关系
  • 服务器从安装到部署全过程(二)
  • 基于Android乐音识别(2)
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 无服务器化是企业 IT 架构的未来吗?
  • Mac 上flink的安装与启动
  • ​HTTP与HTTPS:网络通信的安全卫士
  • # Maven错误Error executing Maven
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (层次遍历)104. 二叉树的最大深度
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (译)2019年前端性能优化清单 — 下篇
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • . Flume面试题
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET Core 成都线下面基会拉开序幕