一篇搞懂vue3中如何使用ref、reactive实现响应式数据

news2025/2/23 0:05:31

ref 可实现 基本类型、对象类型响应式数据

reactive:只能实现 对象类型响应式

ref实现 基本类型 数据响应式: 

<template>
  <div class="person">
    <h2>姓名:{{ name }}</h2>
    <h2>年龄:{{ age }}</h2>
    <button @click="changeName">修改名字</button>
    <button @click="changeAge">修改年龄</button>
    <button @click="showTel">查看联系方式</button>
  </div>
</template>


<script lang="ts" setup name="person234">
import { ref } from 'vue' //想让哪个数据是响应式的,就用ref包裹

    // 定义数据
    //ref()是一个函数,用来包裹数据,让数据变成响应式的
      let name = ref('张三')
      let age = ref(25)
      let tel = '123-456-7890'
      
      console.log(name)
      
    // 定义方法
      function changeName() {
        name.value = '李四'

        console.log(name)
      }
      function changeAge() {
        age.value = 30        //使用 .value 才能改变ref包裹的数据(包裹之后就变成对象了)
      }
      function showTel() {
        alert(tel)
        console.log(tel)
      }
</script>

<style scoped>
.person {
    background-color: rgb(25, 120, 109);
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
  }
button {
  margin: 10px;
}
</style>

ref() 包裹之后,name就变成了一个对象 ,修改数据要通过 .value

 ref处理 对象数据 响应式:

<template>
  <div class="person">
    <h2>一辆{{ car.brand }}车,价值{{ car.price }}w</h2>
    <button @click="changePrice">修改汽车价格</button>
    <hr>
    <h2>喜欢的游戏:</h2>
    <ul>
      <li v-for="g in games" :key="g.id">{{ g.name }}</li>
    </ul>
    <button @click="changeFirstgame">修改第一个游戏</button>
  </div>
</template>

<script lang="ts" setup name="Person">
import { ref } from 'vue'
    
  let car = ref({ brand: '奔驰', price: 100 })

  let games = ref([
        {id: 1, name: '王者荣耀'},
        {id: 2, name: '英雄联盟'},
        {id: 3, name: '绝地求生'}
  ])
 
  // 定义方法
  function changePrice() {
    car.value.price += 10     //ref响应式只有.value才能变成响应式
    console.log(car)
  }

function changeFirstgame() {  //ref响应式只有.value才能变成响应式
    games.value[0].name = '植物大战僵尸'
  }

</script>

<style scoped>
.person {
    background-color: rgb(25, 120, 109);
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
  }
button {
  margin: 10px;
}
li {
  font-size: 20px;
}
</style>

reactive实现对象类型响应式数据:

<template>
  <div class="person">
    <h2>一辆{{ car.brand }}车,价值{{ car.price }}w</h2>
    <button @click="changePrice">修改汽车价格</button>
    <hr>
    <h2>喜欢的游戏:</h2>
    <ul>
      <li v-for="g in games" :key="g.id">{{ g.name }}</li>
    </ul>
    <button @click="changeFirstgame">修改第一个游戏</button>
    <hr>
    <button @click="changeC">修改c的值:{{ obj.a.b.c }}</button>
  </div>
</template>

<script lang="ts" setup name="Person">
  import { reactive } from 'vue'
    // 定义数据
    //reactive()是一个函数,用来包裹对象数据,让其变成响应式的
  let car1 = {brand: '宝马', price: 200 }
  let car = reactive({ brand: '奔驰', price: 100 })
  console.log(car1)
  console.log(car)

  let games = reactive([
        {id: 1, name: '王者荣耀'},
        {id: 2, name: '英雄联盟'},
        {id: 3, name: '绝地求生'}
  ])
  //不管c的值有多深的嵌套,只要是reactive包裹的,都是响应式的
  let obj = reactive({
  a: {
    b: {
      c: 10
    }
  }
  })
    // 定义方法
  function changePrice() {
    car.price += 10
  }

  function changeFirstgame() {
    games[0].name = '植物大战僵尸'
  }
  function changeC() {
    obj.a.b.c = 100
  }
</script>

<style scoped>
.person {
    background-color: rgb(25, 120, 109);
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
  }
button {
  margin: 10px;
}
li {
  font-size: 20px;
}
</style>

 ​​​

 

ref 和 reactive之间的区别:

 ref 用于定义基本类型数据、对象类型数据。

ref 创建的变量必须使用 .value (可以使用VueOfficial插件 启用dot value来优化)

reactive 用来定义:对象类型数据。

reactive重新分配一个新对象,会失去响应式(可以使用car.value、Object.assign去整体替换)。

<script lang="ts" setup name="Person">
import { ref } from 'vue'

let car = ref({ brand: '奔驰', price: 100 })
let sum = ref(0)

// 定义方法
function changePrice() {
  car.value.price += 10
}
function changeBrand() {
  car.value.brand = '宝马'
}
function changeCar() {
  // 这样写不行,因为car是一个ref对象,不能直接赋值
  // car = { brand: '保时捷', price: 1000 } 

  // 直接替换对象
  // car.value = { brand: '保时捷', price: 1000 } 

  // 合并对象属性
  Object.assign(car.value, { brand: '保时捷', price: 1000 }) 
}

function changeSum() {
  sum.value += 1
}
</script>
  • 使用原则:

  1. 若需要一个基本类型的响应式数据,必须使用ref

  2. 若需要一个响应式对象,层级不深,refreactive都可以。

  3. 若需要一个响应式对象,且层级较深,推荐使用reactive

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2303664.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!

命令模式&#xff1a;封装请求&#xff0c;轻松实现解耦&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的命令模式&#xff08;Command Pattern&#xff09;。如果你曾经需要将请求封装成对象&#xff0c;或者希望实现请求的撤销、重做等功能&#xff0c;那么命令模…

Linux-Ansible自动化运维

文章目录 自动化运维Ansible &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年02月21日17点38分 自动化运维 自动化运维常用工具 Ansible 和 SaltStack 自动化运维优势&#xff1a; 服…

uni-app(位置1)

文章目录 一、获取当前的地理位置、速度 uni.getLocation(OBJECT)二、打开地图选择位置 uni.chooseLocation(OBJECT)三、使用应用内置地图查看位置。uni.openLocation(OBJECT) 一、获取当前的地理位置、速度 uni.getLocation(OBJECT) App平台 manifest中配置好自己的地图厂商k…

RabbitMQ服务异步通信

消息队列在使用过程中&#xff0c;面临着很多实际问题需要思考&#xff1a; 1. 消息可靠性 消息从发送&#xff0c;到消费者接收&#xff0c;会经理多个过程&#xff1a; 其中的每一步都可能导致消息丢失&#xff0c;常见的丢失原因包括&#xff1a; 发送时丢失&#xff1a; 生…

CSS基础(浮动、相对定位、绝对定位、固定定位、粘性定位、版心、重置默认样式)

文章目录 1. 浮动&#xff08;float&#xff09;1.1 简介1.2 元素浮动后的特点1.3 脱离文档流示例图1.4 浮动产生的影响1.4.1 积极影响1.4.2 消极影响 1.5 解决浮动产生的影响1.5.1 清除浮动&#xff08;Clearfix&#xff09;1.5.2 创建新的块格式化上下文&#xff08;BFC&…

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护&#xff0c;防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式&#xff0c;对资源或失败单元进行隔离&#xff0c;避免一个服务的失效导致整个系统垮掉&#xff08;雪崩效应&#xff09;。 1 Hystrix监控 Hystrix 提供了对服务…

RagFlow+Ollama 构建RAG私有化知识库

RagFlowOllama 构建RAG私有化知识库 关于RAG一、什么是RAGFlow一、RAGFlow 安装配置测服已有服务&#xff1a; mysql、redis、elasticsearch 二、RAGFlow 配置 ollama&#xff1a;本地运行大型语言模型的工具软件。用户可以轻松下载、运行和管理各种开源 LLM。降低使用门槛&…

【Linux】【网络】不同子网下的客户端和服务器通信

【Linux】【网络】不同子网下的客户端和服务器通信 前两天在进行socket()网络编程并进行测试时&#xff0c;发现在不同wifi下两个电脑无法进行连接&#xff0c;大概去查找了如何解决 看到可以使用 frp 这个快速反向代理实现。 frp 可让您将位于 NAT 或防火墙后面的本地服务器…

SpringBoot教程(十四) SpringBoot之集成Redis

SpringBoot教程&#xff08;十四&#xff09; | SpringBoot之集成Redis 一、Redis集成简介二、集成步骤 2.1 添加依赖2.2 添加配置2.3 项目中使用之简单使用 &#xff08;举例讲解&#xff09;2.4 项目中使用之工具类封装 &#xff08;正式用这个&#xff09;2.5 序列化 &…

OpenHarmony分布式数据管理子系统

OpenHarmony分布式数据管理子系统 简介 目录 组件说明 分布式数据对象数据共享分布式数据服务Key-Value数据库首选项关系型数据库标准数据化通路 相关仓 简介 子系统介绍 分布式数据管理子系统支持单设备的各种结构化数据的持久化&#xff0c;以及跨设备之间数据的同步、…

单片机 Bootloade与二进制文件的生成

单片机的 Bootloader 是一种特殊的程序&#xff0c;负责在单片机上电后初始化硬件、更新用户应用程序&#xff08;固件&#xff09;&#xff0c;并将控制权移交给用户程序。以下是其运行机制和关键流程的详细说明&#xff1a; 1、单片机 Bootloader 的核心作用 固件更新&…

MySQL数据库(3)—— 表操作

目录 一&#xff0c;创建表 1.1 创建表的SQL 1.2 演示 二&#xff0c;查看表 三&#xff0c;修改表 四&#xff0c;删除表 常用的表操作会涉及到两种SWL语句 DDL&#xff08;Data Definition Language&#xff09;数据定义语言&#xff1a;建表、改表、删表等&#xff0…

Springboot + Ollama + IDEA + DeepSeek 搭建本地deepseek简单调用示例

1. 版本说明 springboot 版本 3.3.8 Java 版本 17 spring-ai 版本 1.0.0-M5 deepseek 模型 deepseek-r1:7b 需要注意一下Ollama的使用版本&#xff1a; 2. springboot项目搭建 可以集成在自己的项目里&#xff0c;也可以到 spring.io 生成一个项目 生成的话&#xff0c;如下…

七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)

在棋牌游戏行业高速发展的今天&#xff0c;如何构建一个具备高并发、强稳定性与多功能支持的棋牌游戏系统成为众多开发者和运营团队关注的焦点。七星棋牌全开源修复版源码 凭借其 六端互通、200子游戏玩法、多省区本地化支持&#xff0c;以及 乐豆系统、防沉迷、比赛场、AI智能…

HarmonyOS 开发套件 介绍 ——上篇

HarmonyOS 开发套件 介绍 ——上篇 在当今科技飞速发展的时代&#xff0c;操作系统作为智能设备的核心&#xff0c;其重要性不言而喻。而HarmonyOS&#xff0c;作为华为推出的全新操作系统&#xff0c;正以其独特的魅力和强大的功能&#xff0c;吸引着越来越多的开发者和用户的…

网络空间安全(1)web应用程序的发展历程

前言 Web应用程序的发展历程是一部技术创新与社会变革交织的长卷&#xff0c;从简单的文档共享系统到如今复杂、交互式、数据驱动的平台&#xff0c;经历了多个重要阶段。 一、起源与初期发展&#xff08;1989-1995年&#xff09; Web的诞生&#xff1a; 1989年&#xff0c;欧洲…

JUC并发—9.并发安全集合三

大纲 1.并发安全的数组列表CopyOnWriteArrayList 2.并发安全的链表队列ConcurrentLinkedQueue 3.并发编程中的阻塞队列概述 4.JUC的各种阻塞队列介绍 5.LinkedBlockingQueue的具体实现原理 6.基于两个队列实现的集群同步机制 1.并发安全的数组列表CopyOnWriteArrayList …

Baklib云智协同:数字资产赋能企业效能跃升

内容概要 在数字化转型加速的背景下&#xff0c;Baklib通过构建智能化的知识中台架构&#xff0c;为企业打造了贯穿知识采集、整合、应用的全链路解决方案。该平台以动态知识图谱为核心技术底座&#xff0c;支持文档、音视频、代码等20余种格式的数字资产全生命周期管理&#…

wordpress adrotate插件 文件上传漏洞

当你爆破进wordpress后台但权限不是管理员的时&#xff0c;如果你有adrotate插件操作权限可以用adrotate的文件上传功能get webshell 该漏洞需要AdRotate版本 < 5.13.3 第一步按顺序点击上传文件 在这里文件一定要压缩成zip格式&#xff0c;上传的时候也是上传这个zip 上…

Python爬虫入门到精通:从零开始的数据采集之旅

一、网络世界的"小蜘蛛":什么是爬虫? 想象一下,你是一只勤劳的小蜘蛛,每天在互联网这张巨大的网上爬来爬去。你不需要自己织网,只需要顺着别人织好的网络路径,把有价值的信息收集到自己的小篮子里。这就是爬虫最形象的比喻——一个自动化的信息采集程序。 Py…