首页 > 其他分享 >Vue是怎样依赖收集的?

Vue是怎样依赖收集的?

时间:2024-12-31 09:21:43浏览次数:5  
标签:Vue 收集 Dep Watcher 依赖 数据

Vue的依赖收集是Vue实现响应式数据绑定的核心机制之一。在Vue中,当组件初始化时,Vue会对组件的data进行初始化,将普通的JavaScript对象转换成响应式对象。这个过程中,Vue会进行依赖收集,以便在数据发生变化时能够通知到所有依赖这个数据的地方。以下是Vue依赖收集的主要步骤和原理:

  1. Dep类的创建与作用

    • Vue内部创建了一个Dep类,用于管理所有的Watcher。Dep类中有两个重要的属性:一个是静态属性target,它指向当前正在计算的Watcher;另一个是subs属性,它是一个存储Watcher的数组,表示所有依赖这个Dep的Watcher。
    • Dep类还提供了几个关键方法:addSub用于将Watcher添加到subs数组中,removeSub用于从subs数组中移除Watcher,depend用于在计算属性或渲染过程中建立依赖关系,notify则在数据发生变化时通知所有依赖这个Dep的Watcher执行更新操作。
  2. Watcher类的创建与作用

    • Vue为每个组件实例创建一个Watcher对象。Watcher在初始化时会执行组件的渲染函数或其他计算属性函数,这个过程中会触发数据的getter操作,从而进行依赖收集。
    • Watcher类中有一个重要的方法addDep,它的作用是将当前的Watcher添加到所依赖数据的Dep中。这样,当数据发生变化时,对应的Dep就能通过notify方法通知到这个Watcher进行更新。
  3. 依赖收集过程

    • 在组件初始化或重新渲染时,Vue会调用Watcher的get方法(通常是通过渲染函数间接调用),这个方法内部会执行数据的getter操作。
    • 在getter操作内部,Vue会检查Dep.target是否存在(即是否有正在计算的Watcher)。如果存在,就将当前Dep与这个Watcher建立关联(通过调用Dep的depend方法)。
    • 这样,Vue就完成了从数据到视图的依赖收集过程。每个数据都知道自己被哪些Watcher所依赖,每个Watcher也知道自己依赖了哪些数据。
  4. 数据变化时的响应

    • 当数据发生变化时(例如用户输入改变了某个值),Vue会触发这个数据的setter操作。
    • 在setter操作内部,Vue会通知所有依赖这个数据的Dep进行更新(通过调用Dep的notify方法)。
    • Dep会遍历自己的subs数组,逐一触发里面Watcher的update方法,从而更新对应的视图。

总结来说,Vue的依赖收集是通过Dep类和Watcher类共同协作完成的。Dep类负责管理所有的Watcher并建立数据与Watcher之间的依赖关系;而Watcher类则负责在数据变化时触发视图的更新操作。这种机制使得Vue能够实现响应式的数据绑定和高效的视图更新。

标签:Vue,收集,Dep,Watcher,依赖,数据
From: https://www.cnblogs.com/ai888/p/18643087

相关文章

  • 基于vue的视频播放器的设计与实现+vue源码+论文
    项目简介视频播放器系统是一个多功能的在线视频管理平台,它通过精心设计的功能模块,满足了管理员和用户的不同需求。系统主要分为管理员和用户两大角色,各自拥有独立的功能权限。管理员模块具备强大的后台管理功能,包括视频信息管理、视频留言管理、用户管理和论坛管理等,能够对视......
  • Vue-cli脚手架安装介绍
    1、安装Vue-cli可以使用npm或cnpm安装vue-cli项目构想工具#添加国内淘宝镜像加速sudonpmconfigsetregistryhttps://registry.npmmirror.com/sudonpminstall-g@vue/cli或使用#添加国内淘宝镜像加速sudonpminstall-gcnpm--registryhttps://registry.npmmirr......
  • Vue3 中数组和字符串的处理
    原因:想要在网页文本框中输入一个整型数组,用作Set去重测试。遇到问题:网页文本框中输入的一串内容是字符串格式的,暂且称之为“数组字符串”。解决方式:先把“数组字符串”转换成“字符串数组”格式,再转换为“整型数组”格式。定义变量首先定义一些用到的变量:数组字......
  • 基于Springboot + vue实现的体育馆使用预约平台
    ......
  • Vue 列表渲染
    一、基础1、v-for用来展示列表数据2、语法v-for="(value,index)inxx":key="index"3、可遍历:数组、对象、字符串注意:先是值,再是索引<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="vie......
  • Vue 条件渲染
    一、v-show写法:v-show="表达式"适用于切换频率较高的场景特点:不展示的DOM元素未被移除,仅仅是隐藏<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-......
  • vue 父子组件的生命周期渲染顺序
    在Vue中,父子组件的生命周期钩子函数执行顺序遵循一定的规则。以下是父子组件渲染时的生命周期调用顺序:父子组件渲染顺序父组件beforeCreate父组件created父组件beforeMount子组件beforeCreate子组件created子组件beforeMount子组件mounted父组件mounted更新......
  • ssm实验室预约管理+vue(10871)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......
  • 前端开发vue开发调试源代码
    vue开发调试源代码1.main.js添加Vue.config.devtools=true//Vue.config.productionTip=falseVue.config.devtools=true2.vue.config.js添加devtool:'source-map'module.exports={ productionSourceMap:true, configureWebpack:{ devtool:'source-......
  • Python+Django大学生入伍人员管理系统--(Pycharm Flask Django Vue mysql)
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍大学生入伍人员管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。......