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

vue3的响应式的理解,与普通对象的区别

主要是在使用过程中经常出现非预期情况,基本都是对其响应式原理不是理解的很透彻。

先看下网络上查找到一些资料都不是很直观,具体使用时还是懵懵懂懂。

什么是响应式?

当依赖数据发生改变时,与之关联的数据或计算结果能够自动更新就是响应式。

我现在的理解是,响应式对象 = 代理 + 触发器。

vue3 中响应式对象主要分为ref、reactive、computed、props四种类型。

特性refreactivecomputedprops
用途包装基本类型(如 numberstring 等)包装对象或数组基于响应式数据计算得出新值父组件向子组件传递数据
返回值类型返回一个 ref 对象(包含 .value 属性)返回一个响应式代理对象返回一个只读的 ref 对象普通对象(经过 Vue 代理,具有响应性)
是否可写可写(通过 .value 修改)可写(直接修改属性)默认只读(可通过 get/set 实现可写)只读(不能直接修改)
是否需要 .value需要(在 JS 中)不需要需要(在 JS 中)不需要
模板中使用自动解包,不需要 .value直接访问属性自动解包,不需要 .value直接访问属性
响应性来源通过 .value 触发响应式更新直接通过属性访问触发响应式更新基于依赖的响应式数据自动更新继承父组件传递的响应式数据
适用场景基本类型数据、单个值对象或数组需要动态计算的属性父组件向子组件传递数据
示例const count = ref(0);const state = reactive({ count: 0 });const double = computed(() => count.value * 2);props: { count: Number }

一个对象有且仅有2个功能,1.读取;2修改;所以只要把这2个功能使用情况分析清楚就明白到底什么时候响应式对象了。

1.读取功能

响应式对象读取的是一个代理对象,普通对象读取的就是实际的真实对象。如果只是取值的话,通过代理读取对象和直接读取对象,其实是一样的效果。

这里主要注意:

1.1 读取数据时是否需要.value。具体参照上面表格对照。

1.2 读取返回值对象类型。是代理对象还是真实对象。具体参照上面表格对照。

1.3 依赖收集(Track)

在访问响应式数据时,Vue 会通过 依赖收集 来记录哪些地方(如组件、计算属性、侦听器等)依赖了这些数据。

  • 触发时机:当访问响应式数据的属性时。

  • 作用:记录当前正在运行的副作用(如 effectcomputedwatch 等)。

  • 示例

    const state = reactive({ count: 0 });
    
    effect(() => {
      console.log(state.count); // 访问 state.count,触发依赖收集
    });

2.修改功能

此时,代理对象的作用就体现了。修改数据时,如果是直接通过真实对象引用修改数据,则不会触发相关触发器,执行一系列任务。但是代理对象就可以。vue3的代理对象中有绑定一些触发器函数,通过代理对象修改数据时,会调用相关触发器,执行一些任务,如渲染DOM、触发监听器钩子函数等。

所以,要理解响应式对象的修改功能,就是要了解修改后,vue3实现了哪些触发器(钩子函数)。

2.1. 组件渲染更新

当响应式数据变化时,Vue 会触发组件的重新渲染。最常见的就是v-model绑定。

  • 触发时机:当组件依赖的响应式数据变化时。

  • 作用:更新组件的视图。

  • 示例

    <template>
      <div>{{ count }}</div>
    </template>
    
    <script>
    import { ref } from 'vue';
    
    export default {
      setup() {
        const count = ref(0);
        return { count };
      }
    };
    </script>


2.2. 计算属性更新

计算属性是基于响应式数据动态计算得出的值。当依赖的响应式数据变化时,计算属性会重新计算。

  • 触发时机:当计算属性依赖的响应式数据变化时。

  • 作用:重新计算计算属性的值。

  • 示例

    const doubleCount = computed(() => count.value * 2);
    
    count.value++; // 触发 doubleCount 重新计算


2.3. 侦听器(Watch)触发

侦听器用于监听响应式数据的变化,并在变化时执行回调函数。

  • 触发时机:当侦听的响应式数据变化时。

  • 作用:执行回调函数。

  • 示例

    watch(count, (newValue, oldValue) => {
      console.log('Count changed:', newValue);
    });
    
    count.value++; // 触发 watch 回调


2.4. 生命周期钩子

当响应式数据变化导致组件重新渲染时,Vue 会触发相关的生命周期钩子。

  • 触发时机:组件更新时。

  • 作用:执行生命周期钩子逻辑。

  • 示例

    onUpdated(() => {
      console.log('组件已更新');
    });

当响应式数据变化时,Vue 3 会触发以下机制:

触发器触发时机作用
组件渲染更新组件依赖的响应式数据变化时重新渲染组件
计算属性更新计算属性依赖的响应式数据变化时重新计算计算属性的值
侦听器(Watch)触发侦听的响应式数据变化时执行侦听器回调函数
生命周期钩子组件更新时执行生命周期钩子逻辑

总结

使用vue3的响应式对象时,弄清楚对象类型,那种响应式类型(即代理类型),对应有哪些触发器。

相关文章:

  • ROS基本功能
  • 【吾爱出品】视频素材资源搜索、解析、下载助手
  • 深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
  • 自动化运维之ansible快速入门
  • Ubuntu24.04更新国内源
  • Facebook精准获客:外贸企业如何通过社群营销将产品推广到海外
  • 【2025最新版】软件测试面试题总结(150道题含答案解析)
  • C++ 后台开发简历优化指南和如何利用DeepSeek优化简历
  • 【MySQL数据库】Ubuntu下的mysql
  • 侯捷 C++ 课程学习笔记:C++ 面向对象开发的艺术
  • 协议-NVME
  • springboot整合mybatis-plus(保姆教学) 及搭建项目
  • 离线量化算法和工具 --学习记录1
  • mongodb主从
  • Linux软件编程——标准IO(2025.2.14)
  • 数据库学习 第一次练习
  • 2025.2.15——1400
  • 如何在 Mac 上解决 Qt Creator 安装后应用程序无法找到的问题
  • 哈希算法题
  • P9853 [入门赛 #17] 方程求解
  • 2025年度上海市住房城乡建设管理委工程系列中级职称评审工作启动
  • 国办印发《关于进一步加强困境儿童福利保障工作的意见》
  • 央行谈MLF:逐步退出政策利率属性回归流动性投放工具
  • 协会:坚决支持司法机关依法打击涉象棋行业的违法行为
  • 人民时评:透过上海车展读懂三组密码
  • 首批证券公司科创债来了!拟发行规模超160亿元