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

【Vue3】响应式数据

【Vue3】响应式数据

  • 背景
  • 简介
  • 开发环境
  • 基本数据类型
  • 对象数据类型
    • 使用 reactive 定义对象类型响应式数据
    • 使用 ref 定义对象类型响应式数据
  • ref 和 reactive 的对比
  • 使用原则建议

背景

随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内容并非完全原创,大多是参考其他文章资料整理所得,感谢每位技术人的开源精神。

简介

本文介绍 Vue3 中响应式数据的编写方法。

开发环境

分类名称版本
操作系统WindowsWindows 11
IDEVisual Studio Code1.91.1

基本数据类型

在 【Vue3】组合式 API 基础上修改 Vue 根组件 App.vue 代码。

<!-- 组件结构 -->
<template><div class="person"><h3>姓名:{{ name }}</h3><h3>生日:{{ birth.getFullYear() + '-' + (birth.getMonth() + 1) + "-" + birth.getDate() }}</h3><button @click="showContact">查看联系方式</button><button @click="changeName">修改名字</button></div>
</template><script setup lang="ts" name="App">
import { ref } from 'vue'// 数据定义
let name = ref('哈利·波特')
let birth = new Date('1980-07-31')
let contact = '霍格沃茨魔法学校格兰芬多学院'// 方法定义
function showContact() {alert(contact)
}function changeName() {name.value = 'Harry Potter'
}
</script><!-- 组件样式 -->
<style lang="scss">
.person {background-color: cadetblue;border-radius: 5px;color: white;padding: 20px;button {background-color: gold;border-radius: 5px;padding: 5px 10px;margin-right: 10px;}
}
</style>

对象数据类型

使用 reactive 定义对象类型响应式数据

<!-- 组件结构 -->
<template><div class="person"><h3>姓名:{{ person.name }}</h3><h3>生日:{{ person.birth.getFullYear() + '-' + (person.birth.getMonth() + 1) + "-" + person.birth.getDate() }}</h3><button @click="showContact">查看联系方式</button><button @click="changeName">修改名字</button></div>
</template><script setup lang="ts" name="App">
import { reactive } from 'vue'let person = reactive({name: '哈利·波特',birth: new Date('1980-07-31'),contact: '霍格沃茨魔法学校格兰芬多学院'
})// 方法定义
function showContact() {alert(person.contact)
}function changeName() {person.name = 'Harry Potter'
}
</script><!-- 组件样式 -->
<style lang="scss">
.person {background-color: cadetblue;border-radius: 5px;color: white;padding: 20px;button {background-color: gold;border-radius: 5px;padding: 5px 10px;margin-right: 10px;}
}
</style>

使用 ref 定义对象类型响应式数据

<!-- 组件结构 -->
<template><div class="person"><h3>姓名:{{ person.name }}</h3><h3>生日:{{ person.birth.getFullYear() + '-' + (person.birth.getMonth() + 1) + "-" + person.birth.getDate() }}</h3><button @click="showContact">查看联系方式</button><button @click="changeName">修改名字</button></div>
</template><script setup lang="ts" name="App">
import { ref } from 'vue'let person = ref({name: '哈利·波特',birth: new Date('1980-07-31'),contact: '霍格沃茨魔法学校格兰芬多学院'
})// 方法定义
function showContact() {alert(person.value.contact)
}function changeName() {person.value.name = 'Harry Potter'
}
</script><!-- 组件样式 -->
<style lang="scss">
.person {background-color: cadetblue;border-radius: 5px;color: white;padding: 20px;button {background-color: gold;border-radius: 5px;padding: 5px 10px;margin-right: 10px;}
}
</style>

ref 和 reactive 的对比

  • ref 可以定义基本类型以及对象类型的响应式数据,而 reactive 只能定义对象类型的响应式数据;
  • ref 定义对象类型响应式数据时,底层实际使用的也是 reactive
  • <script> 中使用 ref 定义的响应式数据时,必须使用变量的 .value 属性,reactive 不存在此问题;
  • 如果为 reactive 定义的响应式数据重新分配一个对象,则会失去响应式行为,可以通过 Object.assign()reactive 定义的响应式数据对象整体替换掉。
  • 通过 console.log 打印出由 refreactive 定义的响应式数据,可见其底层实现不同:
    • reactive 定义的响应式数据是 JavaScript 标准内置对象 Proxy,是对原对象的代理,可实现对原对象操作的拦截及自定义。
      在这里插入图片描述

    • ref 定义的响应式数据是 RefImpl 的一个实例对象,原数据在 value 属性中,可见如果原数据为对象类型,则 RefImpl 实例的 value 属性也是 JavaScript 标准内置对象 Proxy,底层与 reactive 一致。
      在这里插入图片描述

使用原则建议

  • 如果需要一个基本类型的响应式数据,则必须使用 ref
  • 如果需要一个对象类型的响应式数据且层级不深,则 refreactive 中可任选一个;
  • 如果需要一个对象类型的响应式数据且层级较深,则推荐使用 reactive
  • 如果不想因区分使用场景烦恼,则直接使用 ref

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RocketMQ~架构与工作流程了解
  • electron项目中实现视频下载保存到本地
  • 【深度学习】VGG-16原理及代码实现
  • 【深度学习】OCR中的Shrink操作详解
  • 【分布式事务】怎么解决分布式场景下数据一致性问题
  • Springboot 3.x - Reactive programming (2)
  • 钡铼Profinet、EtherCAT、Modbus、MQTT、Ethernet/IP、OPC UA分布式IO系统BL20X系列耦合器
  • GOLLIE : ANNOTATION GUIDELINES IMPROVE ZERO-SHOT INFORMATION-EXTRACTION
  • vue基于Cookies实现记住密码自动登录功能
  • Spring Boot外部配置加载顺序
  • Github报错:Kex_exchange_identification: Connection closed by remote host
  • Linux云计算 |【第一阶段】ENGINEER-DAY3
  • centos(或openEuler系统)安装kafka集群
  • 中文科技核心论文发表
  • java多线程等待唤醒机制详细介绍
  • [iOS]Core Data浅析一 -- 启用Core Data
  • android 一些 utils
  • eclipse(luna)创建web工程
  • iOS 系统授权开发
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaWeb(学习笔记二)
  • Laravel Telescope:优雅的应用调试工具
  • laravel with 查询列表限制条数
  • Python学习之路16-使用API
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 对JS继承的一点思考
  • 马上搞懂 GeoJSON
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 微信开放平台全网发布【失败】的几点排查方法
  • 学习HTTP相关知识笔记
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • Hibernate主键生成策略及选择
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #{}和${}的区别?
  • #1015 : KMP算法
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (06)Hive——正则表达式
  • (1)STL算法之遍历容器
  • (20050108)又读《平凡的世界》
  • (二)springcloud实战之config配置中心
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (附源码)计算机毕业设计大学生兼职系统
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (图)IntelliTrace Tools 跟踪云端程序
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (原)Matlab的svmtrain和svmclassify
  • (转)C#调用WebService 基础
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • ./configure,make,make install的作用
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net Application的目录
  • .net core webapi 大文件上传到wwwroot文件夹