news 2026/5/3 16:55:38

Vue.js 响应接口

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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的特殊用法。
  • 响应式系统的核心是数据变化自动触发视图更新,理解其机制能避免常见坑点。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 16:49:45

八大网盘直链下载助手LinkSwift:免费高效的终极下载解决方案

八大网盘直链下载助手LinkSwift:免费高效的终极下载解决方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 …

作者头像 李华
网站建设 2026/5/3 16:48:41

AI在C++上面能力弱的原因

存在头文件hpp和源文件cpp,需要配合------------其实就是跨文件问题比较严重。有可能是很多人发出来的cpp文件里面没有发hpp文件,导致AI收录的内容不全面,无法正常运转我现在既然用了python和java,那么主要依赖的就是速度------------能快速开…

作者头像 李华
网站建设 2026/5/3 16:48:35

小红书无水印下载神器XHS-Downloader:5分钟快速上手指南

小红书无水印下载神器XHS-Downloader:5分钟快速上手指南 【免费下载链接】XHS-Downloader 小红书(XiaoHongShu、RedNote)链接提取/作品采集工具:提取账号发布、收藏、点赞、专辑作品链接;提取搜索结果作品、用户链接&a…

作者头像 李华
网站建设 2026/5/3 16:46:32

鸣潮自动化工具终极指南:从零开始实现一键日常管理

鸣潮自动化工具终极指南:从零开始实现一键日常管理 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves 你是否厌倦了每天重…

作者头像 李华
网站建设 2026/5/3 16:45:36

CVAT数据集导入导出保姆级教程:从YOLO到COCO,一次搞定所有格式转换

CVAT数据集格式转换实战指南:YOLO/COCO/VOC互通的完整解决方案 当你在不同计算机视觉项目间切换时,是否经常遇到这样的困境:好不容易标注好的数据集,却因为格式不兼容而无法直接使用?上周我的团队就为此浪费了整整两天…

作者头像 李华