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

Vue3:ref和reactive实现响应式数据

一、情景说明

Vue2中,我们已经知道数据的响应式,是什么含义
就是,在data块中,定义的变量,在页面中引用后
任何地方修改了该变量,页面中引用的变量会立即显示最新数值。

这块,我们学习了
插值语法:{{}}
单向绑定指令:v-bind
双向绑定指令:v-model

那么,在Vue3中,没有了data块,如何实现数据的响应式了?

二、响应式数据

Person.vue组件

<template><div class="person"><h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2><h2>地址:{{address}}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="showTel">查看联系方式</button></div>
</template><script lang="ts" setup name="Person">// 数据,原来是写在data中的,此时的name、age、tel都不是响应式的数据let name = '张三'let age = 18let tel = '13888888888'let address = '北京昌平区宏福苑·宏福科技园'// 方法function changeName() {name = 'zhang-san' //注意:这样修改name,页面是没有变化的console.log(name) //name确实改了,但name不是响应式的}function changeAge() {age += 1 //注意:这样修改age,页面是没有变化的console.log(age) //age确实改了,但age不是响应式的}function showTel() {alert(tel)}
</script>

1、ref实现基本类型的数据响应式

针对上面的组件,我们想要实现name、age两个变量的数据响应式效果。
script引用函数:

import {ref} from 'vue'

创建变量:

  let name = ref('张三')let age = ref(18)

读取变量:

        <h2>姓名:{{name}}</h2><h2>年龄:{{age}}</h2>

修改变量:
JS中操作ref创建的变量时候需要.value

  // 方法function changeName() {name.value = 'zhang-san'}function changeAge() {age.value += 1 }

2、ref实现对象类型的数据响应式

底层是reactive实现的功能
script引用函数:

import {ref} from 'vue'

创建变量:

  let car = ref({brand:'奔驰',price:100})let games = ref([{id:'aysdytfsatr01',name:'王者荣耀'},{id:'aysdytfsatr02',name:'原神'},{id:'aysdytfsatr03',name:'三国志'}])

读取变量:

 <h2>汽车信息:一辆{{car.brand}}车,价值{{car.price}}万</h2><li v-for="g in games" :key="g.id">{{g.name}}</li>

修改变量:
JS中操作ref创建的变量时候需要.value

  function changePrice(){car.value.price += 10console.log(car.value.price)}function changeFirstGame(){games.value[0].name = '流星蝴蝶剑'}

3、reactive实现对象类型的数据响应式

script引用函数:

import {reactive} from 'vue'

创建变量:
创建了3个响应式对象数据

  // 数据// 单个对象数据let car = reactive({brand:'奔驰',price:100})// 数组型对象let games = reactive([{id:'aysdytfsatr01',name:'王者荣耀'},{id:'aysdytfsatr02',name:'原神'},{id:'aysdytfsatr03',name:'三国志'}])// 多层次对象let obj = reactive({a:{b:{c:666}}})

读取变量:

 <h2>汽车信息:一辆{{car.brand}}车,价值{{car.price}}万</h2><li v-for="g in games" :key="g.id">{{g.name}}</li><h2>测试:{{obj.a.b.c}}</h2>

修改变量:

    // 方法function changePrice(){car.price += 10console.log(car.price)}function changeFirstGame(){games[0].name = '流星蝴蝶剑'}function changeObj(){obj.a.b.c = 999}

4、注意事项

reactive创建的对象变量,被重新分配一个新对象时,会失去响应式效果
ref创建的对象类型变量,不存在这个问题。
问题重现:
reactive定义一个对象类型的变量

    let car = reactive({brand:'奔驰',price:100})

需求:
给car重新赋值一个对象
无效写法:

car = {brand:'奥拓',price:1}
car = reactive({brand:'奥拓',price:1})

有效写法:

Object.assign(car,{brand:'奥拓',price:1})

三、对比

  • 宏观角度看:
  1. ref用来定义:基本类型数据对象类型数据

  2. reactive用来定义且只能定义:对象类型数据

  • 区别:
  1. ref创建的变量必须使用.value(可以使用volar插件自动添加.value)。
  2. reactive重新分配一个新对象,会失去响应式(可以使用Object.assign去整体替换)。
  • 使用原则:
  1. 若需要一个基本类型的响应式数据,必须使用ref
  2. 若需要一个响应式对象,层级不深,refreactive都可以。
  3. 若需要一个响应式对象,且层级较深,推荐使用reactive

相关文章:

  • Java中常用的集合及方法(2)
  • Day36:安全开发-JavaEE应用第三方组件Log4j日志FastJson序列化JNDI注入
  • Java学习笔记NO.18
  • 去除PDF论文行号的完美解决方案
  • 云计算项目十一:构建完整的日志分析平台
  • C++进阶学习
  • AWS使用 Client VPN 配置访问VPC 内网资源
  • android pdf框架-7,白边切割
  • 安卓项目:app注册/登录界面设计
  • 【NR技术】 3GPP支持无人机的关键技术以及场景
  • 《C++游戏编程入门》第2章 真值、分支与游戏循环: Guess My Number
  • vue项目部署和镜像打包
  • 今天做了两个工具
  • leetcode一天一题-第1天
  • 各种实用设置
  • 【EOS】Cleos基础
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • Angular6错误 Service: No provider for Renderer2
  • Django 博客开发教程 16 - 统计文章阅读量
  • Github访问慢解决办法
  • HTML中设置input等文本框为不可操作
  • Koa2 之文件上传下载
  • node-glob通配符
  • Spring Cloud中负载均衡器概览
  • Web标准制定过程
  • WePY 在小程序性能调优上做出的探究
  • 关于Flux,Vuex,Redux的思考
  • 来,膜拜下android roadmap,强大的执行力
  • 一起参Ember.js讨论、问答社区。
  • 一天一个设计模式之JS实现——适配器模式
  • Linux权限管理(week1_day5)--技术流ken
  • ​第20课 在Android Native开发中加入新的C++类
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (推荐)叮当——中文语音对话机器人
  • (转)C#调用WebService 基础
  • (转)Unity3DUnity3D在android下调试
  • ******IT公司面试题汇总+优秀技术博客汇总
  • *1 计算机基础和操作系统基础及几大协议
  • .htaccess 强制https 单独排除某个目录
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .Net小白的大学四年,内含面经
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • [ 转载 ] SharePoint 资料
  • [android] 手机卫士黑名单功能(ListView优化)