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

理解vue中的ref

前端代码

<template><divclass="container"><button @click="fetchDataFromBackend">获取后端信息</button><divclass="display-box"><p>返回的消息:{{info}}</p></div></div></template><script setup>import{ref}from'vue';importaxios from'axios';//1. 定义响应式变量,用于绑定文字框 const info=ref('点击按钮获取内容...');//2. 编写请求函数 const fetchDataFromBackend=async()=>{try{// 像后端接口发送 GET 请求 const response=await axios.get('http://127.0.0.1:8000/api/data');//3. 将返回的数据赋值给响应式变量,页面会自动更新 info.value=response.data.message;}catch(error){console.error("请求失败:", error);info.value="无法连接到后端服务器";}};</script>

在上面的VUE的示例代码中,有一个info变量。继承自ref
上面的代码其实是分了两部分,一部分是上面的VUE前端代码,一部分是下面的JS代码。
这里的ref在 JavaScript 中不是一个普通的字典(Object),而是一个“响应式代理对象”。因此不能直接用python中的字典类型去套。

这是一个非常棒的观察!对于刚从 Python(FastAPI)转到 Vue 3 的开发者来说,这确实是一个容易混淆的地方。

简单来说:info在 JavaScript 中不是一个普通的字典(Object),而是一个“响应式代理对象”。


1. 什么是ref对象?

当你使用const info = ref('...')时,Vue 会把你的原始数据(字符串、数字或对象)包装在一个特殊的RefImpl(Ref 实现)对象中。

这个对象主要包含以下几个关键部分:

字段名作用
.value最核心的字段。存储你真正的原始值。Vue 拦截了对这个字段的访问和修改,从而实现“数据变了,页面跟着变”。
__v_isRef一个标识符,Vue 用它来判断这个变量是不是由ref创建的。
dep内部使用的依赖收集器,用来记录哪些组件正在使用这个变量,以便更新。

一句话总结:info本身是一个“盒子”,.value才是盒子里装的东西。在<script>中你需要手动开盒(.value),但在<template>模板中,Vue 会帮你自动开盒。


2. 案例对比:Python 字典 vs Vue Ref

为了方便理解,我们可以对比一下两者的操作逻辑:

在 Python (FastAPI) 中

数据是静态的。

# 这是一个真正的字典user_info={"message":"Hello"}print(user_info["message"])# 直接访问键

在 Vue 3 中

数据是响应式的。

// info 不是字典,而是一个被 Vue 监控的“盒子”constinfo=ref("Hello");// 修改数据info.value="World";// 背后发生的事情:// 1. 你修改了 value// 2. info 内部的监听器触发// 3. Vue 通知浏览器:“嘿!页面上用到 info 的地方都要重画一下!”

3. 为什么不直接用普通变量?

如果你在 Vue 里直接写let info = "Hello",当你修改这个变量时,网页上的文字是不会变的

案例演示:

  • 普通变量:你改了变量,页面像死水一样没反应。
  • ref变量:你改了.value,页面上的文字会瞬间“跳”成新的内容。

4. 特殊情况:如果 ref 里面装的是对象

如果你用ref装了一个对象,你会发现需要写“两层”:

constuser=ref({name:'张三',age:25});// 访问名字:console.log(user.value.name);// 第一层 .value 进盒子,第二层 .name 访问字典键

💡 避坑小贴士

在 Vue 3 开发中,最常见的报错就是:“忘了写.value

  • 如果你发现打印info出来是一堆奇奇怪怪的对象(包含dep,__v_isRef等),那说明你忘了加.value
  • 但在 HTML 模板<template>里面,绝对不要.value,Vue 会自动处理。

划重点,在vue的template中,绝对不要写.value,因为ref本身就是VUE自己定义的对象,VUE会自己识别里面的内容并做处理,会自动“开盒”。

http://www.jsqmd.com/news/322207/

相关文章:

  • 衡水英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜
  • 湘潭英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜
  • 云计算网络基础:VPC、子网与安全组配置
  • 无人机螺旋桨运行专业的技术解析
  • 1 篇看懂:以太网多参量传感器为什么能适配所有工业场景?
  • zview3.1安装教程
  • 廊坊英语雅思培训机构推荐。2026权威测评出国雅思辅导机构口碑榜
  • 如何借助YashanDB实现高效的数据集成
  • 衡水英语雅思培训机构推荐。2026权威测评出国雅思辅导机构口碑榜
  • [特殊字符] 普通用户也能轻松搞定:使用微软官方工具 texconv 将图片转为 8.8.8.8 ARGB 32bpp 无压缩 DDS(无 MIP、2D 纹理)
  • 移动端跨平台方案对比:Flutter与React Native
  • 系列一:2D 游戏 UI 组件库 (Game UI Asset Kit)提示词详解
  • 如果一个公司要自建物联网平台,那么应该怎么搭建呢?
  • 华为笔记本电脑:接口配置与日常需求的完美匹配
  • 2026年路灯厂家哪家强? 优质生产厂家盘点及实用选型参考与选型指南
  • 如何借助YashanDB数据库构建弹性数据存储架构
  • 2026年全案落地终极选型指南:TOP5家具源头工厂交付确定性与整屋系统协同融合的广州深圳东莞深度解析
  • 廊坊英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜
  • 湘潭英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜
  • 微服务治理:服务发现与配置中心架构设计
  • 百考通文献综述写作功能:AI智能辅助,三步生成逻辑清晰、结构完整、引用规范的高质量学术综述
  • 如何借助YashanDB数据库构建数据驱动企业
  • IMU如何成为机器人自主移动的核心传感器
  • 权限控制操作流程验证:软件测试从业者的实用指南
  • SuperMap iClient for OpenLayers如何实现对影像服务设置图层掩膜
  • 安诺尼:实时频谱仪核心原理深度解析——从信号捕获到分析的逻辑
  • 基于springboot的水务管理系统设计实现
  • 廊坊英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜
  • 一吨不是重量,是风险:重型机械安装工程的专业门槛
  • 主定理学习笔记