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

Vue.js 响应接口

在 Vue.js 中,“响应式接口”指的是 Vue 提供的用于创建、读取和修改响应式数据的核心 API。这些 API 能够让数据的变化自动触发视图更新。

Vue 2 和 Vue 3 的响应式实现机制不同,因此 API 也有显著差异。


一、Vue 3 响应式 API (Composition API)

Vue 3 基于 ES6Proxy实现,提供了更灵活、更强大的响应式系统。

1.ref():基本类型与对象的响应式

用于创建响应式数据,自动解包(在模板中访问时去掉.value)。

import{ref}from'vue';// 基本类型constcount=ref(0);count.value++;// 修改必须加 .value// 对象(自动转为 reactive)constuser=ref({name:'Tom',age:20});user.value.name='Jerry';// 修改

特点

  • 在模板中自动解包:{{ count }}直接显示值,无需{{ count.value }}
  • 在 JS 中访问必须加.value
  • 可以包裹任何类型(包括对象、数组)。

2.reactive():对象的响应式

用于创建对象或数组的响应式代理,不需要.value

import{reactive}from'vue';conststate=reactive({count:0,user:{name:'Tom'},list:[1,2,3]});state.count++;// 直接修改,无需 .valuestate.user.name='Jerry';state.list.push(4);

特点

  • 只能用于对象或数组。
  • 修改时不需要.value
  • 注意:不能直接替换整个对象(state = {}会失去响应性),必须修改内部属性。

3.computed():计算属性

基于现有响应式数据派生出新的数据,缓存结果,依赖变化时重新计算。

import{ref,computed}from'vue';constfirstName=ref('John');constlastName=ref('Doe');constfullName=computed(()=>{returnfirstName.value+' '+lastName.value;});// 使用console.log(fullName.value);// "John Doe"// 修改依赖firstName.value='Jane';console.log(fullName.value);// "Jane Doe" (自动更新)

特点

  • 只读(默认),不能直接赋值。
  • 支持读写(传入getset)。
  • 具有缓存性,依赖不变时不重新计算。

4.watch()watchEffect():侦听器

监听数据变化并执行副作用。

watch():显式监听指定数据
import{ref,watch}from'vue';constcount=ref(0);watch(count,(newVal,oldVal)=>{console.log(`count changed:${oldVal}->${newVal}`);});count.value++;// 触发
watchEffect():自动收集依赖

立即执行,并自动追踪内部使用的响应式数据。

import{ref,watchEffect}from'vue';constcount=ref(0);watchEffect(()=>{console.log('Count is:',count.value);// 自动追踪 count});count.value++;// 触发

二、Vue 2 响应式 API (Options API)

Vue 2 基于Object.defineProperty实现,API 相对固定。

1.data()选项

在组件选项中定义响应式数据。

exportdefault{data(){return{count:0,user:{name:'Tom'}};},methods:{increment(){this.count++;// 直接修改}}};

2.Vue.set()/this.$set()

解决 Vue 2 的两大限制

  1. 动态添加属性不响应。
  2. 数组索引修改不响应。
// 动态添加属性this.$set(this.user,'age',20);// 或 Vue.set(this.user, 'age', 20)// 修改数组索引this.$set(this.list,0,999);

3.Vue.delete()/this.$delete()

删除对象属性并触发更新。

this.$delete(this.user,'age');

4.watch选项

exportdefault{data(){return{question:'',answer:'...'};},watch:{question(newVal,oldVal){// 监听 question 变化}}};

三、Vue 2 vs Vue 3 核心差异

特性Vue 2Vue 3
底层实现Object.definePropertyProxy
对象响应式data()返回对象reactive()ref()
基本类型响应不支持(需放在对象中)ref()支持
动态添加属性Vue.set直接赋值即可
数组修改需重写方法或Vue.set直接修改即可
删除属性Vue.delete直接delete即可
监听器watch选项watch(),watchEffect()
计算属性computed选项computed()

四、最佳实践与注意事项

1.refvsreactive怎么选?

  • 推荐默认使用ref
    • 统一使用ref可以避免.value的混淆(在模板中自动解包)。
    • 可以方便地替换整个对象(state.value = newObj)。
  • reactive适用场景
    • 确定只处理对象/数组,且不需要替换整个对象。
    • 代码风格偏好(不想写.value)。

2. 解构响应式对象

直接解构会失去响应性

const{count}=state;// ❌ 失去响应性

解决方案

  • 使用toRefs:将对象属性转换为ref
import{toRefs}from'vue';const{count,name}=toRefs(state);// ✅ 保持响应性
  • 或者在模板中直接访问:{{ state.count }}

3. 响应式丢失场景

  • Vue 2:动态添加属性、数组索引修改。
  • Vue 3
    • reactive对象解构(const { count } = state)。
    • ref对象赋值给普通变量(let c = count,需c.value)。
    • 使用Object.assign替换整个reactive对象。

4. 性能优化

  • shallowRef/shallowReactive
    对于大型对象(如 ECharts 实例、DOM 节点),不需要深层响应式,使用浅层 API 提升性能。
    import{shallowRef}from'vue';constchart=shallowRef(null);// 只监听 chart 本身变化,不监听内部属性

五、总结

需求Vue 3 APIVue 2 API
创建基本类型响应式ref(0)放在data对象中
创建对象响应式reactive({})ref({})data()返回对象
计算属性computed(() => ...)computed: { ... }
监听数据watch(),watchEffect()watch: { ... }
动态添加属性直接赋值this.$set()
删除属性deletethis.$delete()

核心原则

  • Vue 3 推荐使用ref+reactive+computed+watch组合。
  • Vue 2 需注意set/delete的特殊用法。
  • 响应式系统的核心是数据变化自动触发视图更新,理解其机制能避免常见坑点。
http://www.jsqmd.com/news/745587/

相关文章:

  • 进程地址空间简介
  • 免费在线 AVIF 转 JPG 工具:无需上传,浏览器端极速批量转换
  • why work less hours?
  • FM350-GL模块上网保姆级教程:从串口AT指令到Windows网络配置,一次搞定移动/联通/电信/广电4G
  • 星露谷物语终极自动化农场指南:如何用SMAPI模组彻底解放双手
  • 如何快速搭建你的第一个QQ机器人:Go-CQHTTP终极指南
  • 完全指南:TrollInstallerX iOS越狱工具深度解析与实战部署
  • 天赐范式第30天:独有分子系列之二 —— 全新非对称五烷基苯酚CCc1c(C)c(C)c(CC)c(CC)c1O 全链路毒理推演与应用评估报告
  • 3分钟搞定原神成就导出:YaeAchievement让你的游戏数据管理更轻松
  • 2026年4月技术好的小龙虾分选机实力厂家推荐,小龙虾筛选机/小龙虾分选机/小龙虾筛选设备,小龙虾分选机制造厂家哪个好 - 品牌推荐师
  • Java 25向量计算避坑手册:为何你的VectorSpecies总是fallback到scalar模式?(JIT日志深度诊断全流程)
  • 音频转换解密工具完全指南:一站式解决加密音乐播放问题
  • 保姆级教程:在CentOS 7上用yum一键安装iperf3网络测速工具(附常用命令速查表)
  • luogu P3083 [USACO13OPEN] Luxury River Cruise S 题解
  • the ideal world
  • 避开版本地狱!用Python 3.7 + TensorFlow 1.14.0 保姆级复现经典PINN源码
  • SonarQube+GitLab CI实战:我们团队如何将代码异味消灭在合并请求之前
  • 游戏服务器架构发展历史
  • 一键下载30+平台免费文档:告别繁琐登录与广告干扰
  • PyTorch新手必踩的坑:为什么你的NumPy数组喂不进nn.Linear?一个转换搞定
  • 快手号水印怎么去掉?去掉快手号水印的方法全汇总,2026实测有效 - 科技热点发布
  • 在 Claude Code 中无缝对接 Taotoken 获取模型能力
  • PHP记录 公共的twig文件03
  • 2026年3月无框力矩电机销售厂家如何选,无框力矩电机/编码器/力矩电机/定制化无框电机,无框力矩电机产品电话 - 品牌推荐师
  • 从数据手册到实际代码:AK09918地磁传感器Linux驱动开发全流程解析
  • 架构设计:Go-CQHTTP高性能QQ机器人框架的技术实现原理
  • 抖音视频怎么去掉水印?去除抖音号水印的方法全汇总,2026实测工具推荐 - 科技热点发布
  • Thinking Skills 第二阶段:从领域路由到 Benchmark 驱动的自进化
  • 题解:P15403 [NOISG 2026 Prelim] Mushroom Ring
  • 逆向思维实战:从BUUCTF SimpleRev题解,聊聊用Python辅助IDA进行字符加密爆破