news 2026/4/3 5:00:01

理解vue中的ref

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
理解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会自己识别里面的内容并做处理,会自动“开盒”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/1 3:04:32

总有机碳分析仪、TOC分析仪

北京北广精仪公司总有机碳分析仪&#xff1a;技术创新与应用实践 总有机碳分析仪、TOC分析仪 在制药、环保、电子和食品等行业中&#xff0c;水质监测是确保产品质量和环境安全的关键环节。总有机碳&#xff08;TOC&#xff09;作为衡量水体中有机污染物总量的重要指标&#…

作者头像 李华
网站建设 2026/3/31 17:02:35

基于springboot的家装预算管理系统设计实现

背景分析 家装行业近年来快速发展&#xff0c;但预算管理环节普遍存在手工记录效率低、数据易丢失、成本控制不精准等问题。传统Excel表格或纸质记录方式难以应对复杂项目中的材料价格波动、人工成本核算及多项目并行管理需求。 技术驱动因素 SpringBoot框架的成熟应用为快速…

作者头像 李华
网站建设 2026/3/29 20:56:00

权限控制操作流程验证:软件测试从业者的实用指南

权限控制验证的重要性‌ 在当今数字化时代&#xff0c;权限控制&#xff08;Access Control&#xff09;是软件系统的核心安全机制&#xff0c;它管理用户对资源的访问权限&#xff08;如数据、功能模块&#xff09;。作为软件测试从业者&#xff0c;验证权限控制操作流程至关…

作者头像 李华
网站建设 2026/3/20 18:11:36

力扣718 最长重复子数组 java实现

718.最长重复子数组 给两个整数数组 nums1 和 nums2 &#xff0c;返回 两个数组中 公共的 、长度最长的子数组的长度 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,3,2,1], nums2 [3,2,1,4,7] 输出&#xff1a;3 解释&#xff1a;长度最长的公共子数组是 [3,2,1] 。示…

作者头像 李华
网站建设 2026/3/28 7:14:32

虎贲等考 AI:重新定义学术创作!AI 驱动的全流程论文写作智能伙伴

在学术探索的道路上&#xff0c;每一位学子、科研工作者都曾面临 “选题迷茫无措、文献梳理繁杂、实证分析棘手、格式优化耗时” 的困境 —— 深夜对着空白文档无从下笔&#xff0c;花费数周整理的文献却因引用虚假被打回&#xff0c;精心绘制的图表因不符合学术规范反复修改&a…

作者头像 李华