vue3定义响应式数据(ref,reactive)

2024-09-04 10:36

本文主要是介绍vue3定义响应式数据(ref,reactive),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 ref 定义响应式数据

在 Vue 3 中,ref 是一个用于创建响应式数据的 API。ref 可以用来使普通的 JavaScript 值(如字符串、数字、对象等)变得响应式,从而在 Vue 的模板中使用和自动更新。

  1. 基本用法
  • 导入 ref:首先,你需要从 Vue 中导入 ref。
  • 创建响应式数据:使用 ref 创建一个响应式的值。
  • 访问和更新响应式数据:你可以通过 .value 属性来访问和更新响应式数据。
  1. **作用:**定义响应式变量。
  2. 语法:let xxx = ref(初始值)
  3. **返回值:**一个RefImpl的实例对象,简称ref对象refref对象的value属性是响应式的
  4. 注意点:
  • JS中操作数据需要:xxx.value,但模板中不需要.value,直接使用即可。
  • 对于let name = ref('张三')来说,name不是响应式的,name.value是响应式的。
  1. ref 创建:基本类型的响应式数据:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue 3 ref 示例</title><script src="https://unpkg.com/vue@next"></script>
</head>
<body><div id="app"><p>当前计数: {{ count }}</p><button @click="increment">增加计数</button></div><script>const { ref, createApp } = Vue;createApp({setup() {// 创建一个响应式的计数器const count = ref(0);// 定义增加计数的函数function increment() {count.value++;}// 返回响应式数据和方法以供模板使用return {count,increment};}}).mount('#app');</script>
</body>
</html>
  1. ref 创建:对象类型的响应式数据:
const { ref, createApp } = Vue;createApp({setup() {const state = ref({name: 'Alice',age: 30});const items = ref([1, 2, 3]);function updateName(newName) {state.value.name = newName;}function addItem(item) {items.value.push(item);}return {state,items,updateName,addItem};}
}).mount('#app');

二 reactive定义响应式数据

在 Vue 3 中,reactive 是一个用于创建响应式对象的 API。与 ref 主要用于处理基本数据类型不同,reactive 适用于处理更复杂的数据结构,如对象和数组。使用 reactive 创建的对象会对其属性的变化进行响应式更新。

  • 作用:定义一个响应式对象(基本类型不要用它,要用ref,否则报错)
  • 语法:let 响应式对象= reactive(源对象)
  • **返回值:**一个Proxy的实例对象,简称:响应式对象。
  • 注意点:reactive定义的响应式数据是“深层次”的。
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue 3 reactive 示例</title><script src="https://unpkg.com/vue@next"></script>
</head>
<body><div id="app"><p>姓名: {{ state.name }}</p><p>年龄: {{ state.age }}</p><button @click="updateName('Bob')">更改姓名</button><button @click="incrementAge">增加年龄</button></div><script>const { reactive, createApp } = Vue;createApp({setup() {// 创建一个响应式对象const state = reactive({name: 'Alice',age: 30});// 更新对象的属性function updateName(newName) {state.name = newName;}function incrementAge() {state.age++;}// 返回响应式对象和方法以供模板使用return {state,updateName,incrementAge};}}).mount('#app');</script>
</body>
</html>

说明

  1. 创建响应式对象:
  • const state = reactive({ name: ‘Alice’, age: 30 }); 将一个包含 name 和 age
    属性的对象转化为响应式对象。
  1. 访问和更新响应式对象:
  • 在模板中,你可以直接使用 state.name 和 state.age。 在 JavaScript 代码中,你可以直接通过 state.name 和 state.age 访问和修改这些属性。
  1. 响应式更新:
  • 当你更新 state 对象的属性时,例如调用 updateName(‘Bob’) 或 incrementAge(),Vue会自动更新视图。

三 ref 和reactive 的区别

宏观角度看:

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

ref

  1. 用途:
  • 用于创建对基本数据类型(如 string、number、boolean)的响应式引用。
  • 也可以用于创建对对象或数组的响应式引用,但在这种情况下,ref 本身是对对象或数组的一个“包裹”。
  1. 创建方式:
const value = ref(initialValue);
  1. 访问和更新:
  • 对于基本数据类型,使用 .value 进行访问和更新。例如:value.value = 10
  • 对于对象或数组,可以使用 .value 访问和修改它们的内容,但 .value 只是用于访问 ref包裹的内容。具体的更新和访问内容会通过 .value 进行。

reactive

1 用途:

  • 用于创建对复杂数据结构(如对象和数组)的响应式引用。
  • 自动将整个对象或数组的属性变为响应式,而不需要显式地使用 .value。

2 创建方式:

const state = reactive(initialObject);

3 访问和更新:

  • 直接通过对象或数组的属性访问和更新,不需要 .value。例如:state.name = 'Alice'

四 toRefs 与 toRef

  • 作用:将一个响应式对象中的每一个属性,转换为ref对象。
  • 备注toRefstoRef功能一致,但toRefs可以批量转换。
  • 语法如下
<template><div class="person"><h2>姓名:{{person.name}}</h2><h2>年龄:{{person.age}}</h2><h2>性别:{{person.gender}}</h2><button @click="changeName">修改名字</button><button @click="changeAge">修改年龄</button><button @click="changeGender">修改性别</button></div>
</template><script lang="ts" setup>import {ref,reactive,toRefs,toRef} from 'vue'// 数据let person = reactive({name:'张三', age:18, gender:'男'})// 通过toRefs将person对象中的n个属性批量取出,且依然保持响应式的能力let {name,gender} =  toRefs(person)// 通过toRef将person对象中的gender属性取出,且依然保持响应式的能力let age = toRef(person,'age')// 方法function changeName(){name.value += '~'}function changeAge(){age.value += 1}function changeGender(){gender.value = '女'}
</script>

这篇关于vue3定义响应式数据(ref,reactive)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135780

相关文章

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I