关于Vue源码vm.$watch()内部原理详解

关于Vue源码vm.$watch()内部原理详解

1. 简介

vm.$watch() 是 Vue.js 内置的一个 API,用于监控 Vue 实例上的数据变化,并作出相应的响应式行为。在使用 Vue 进行开发时,经常会使用 $watch() 进行数据监听操作。

2. 原理

当我们使用 vm.$watch() 时,会创建一个监听器对象(Dep),用于监听指定属性的变化,并执行相应的回调函数。监听器对象会被添加到该属性对应的依赖列表中,当属性变化时,会通知所有依赖于这个属性的监听器对象,执行其回调函数。

在 Vue.js 的实现中,监听器对象是通过 Object.defineProperty() 来实现响应式的。当各个组件中的监听的数据改变时,监听器对象便会触发相应的回调函数。

3. 示例说明

示例1:

现在我们要监听 Vue 实例中的一个 msg 数据的变化:

var vm = new Vue({
  data: {
    msg: 'hello world'
  }
});

vm.$watch('msg', function (newVal, oldVal) {
  console.log('msg changed from ' + oldVal + ' to ' + newVal);
});

以上代码中,我们通过 $watch() 监听了 msg 数据的变化,并在变化时执行回调函数。其内部的实现原理是:为 msg 属性创建一个监听器对象(Dep),并将其添加到消息订阅器中,收集所有依赖于 msg 属性的组件,并在属性变化时通知订阅器,执行回调函数。

示例2:

在 Vue.js 中,我们同样可以使用 $watch() 监听一个计算属性的变化:

var vm = new Vue({
  data: {
    firstName: 'John',
    lastName: 'Doe'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName;
    }
  }
});

vm.$watch('fullName', function (newVal, oldVal) {
  console.log('fullName changed from ' + oldVal + ' to ' + newVal);
});

以上代码中,我们监听了 fullName 计算属性的变化,并在变化时执行回调函数。其内部实现原理与示例1类似,为 fullName 属性创建一个监听器对象并将其添加到所有依赖的组件中,在属性变化时通知所有订阅器并执行回调函数。

4. 总结

通过本文,我们可以了解到 vm.$watch() 的内部原理,即创建监听器对象,将其添加到依赖列表中,并在属性变化时通知所有订阅器,并执行回调函数。在实际使用中,我们可以通过该 API 监听 Vue 实例中数据的变化,并作出相应的响应式处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于Vue源码vm.$watch()内部原理详解 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Vue (Vuex)中 store 基本用法

    Vue 提供了 Vuex 这个基于 Flux 架构的状态管理工具。使用 Vuex,我们可以在应用程序的任何组件中非常方便的存储和更新应用的状态数据。这里我们来讲解一下 Vuex 中 store 的基本用法,包括 state、getters、mutations 和 actions 四个部分。 创建 store 我们需要先创建一个 Vuex.store,这个 s…

    Vue 2023年5月27日
    00
  • 15 分钟掌握vue-next函数式api(小结)

    下面我会详细讲解“15 分钟掌握vue-next函数式api(小结)”的完整攻略。 标题 15 分钟掌握vue-next函数式api(小结) 内容 Vue 3.0中提供了许多新的函数式API,这些API尤其适合组合或动态创建组件。本文将介绍这些API的用途,并通过一些示例来帮助您更好地理解这些函数式API。 1. h 函数 h函数是Vue中用于创建虚拟DOM…

    Vue 2023年5月28日
    00
  • Vue组件的使用及个人理解与介绍

    下面是关于“Vue组件的使用及个人理解与介绍”的完整攻略。 什么是Vue组件 组件是Vue.js中最强大的功能之一,它将复杂的应用程序拆分为更小的、可复用的部分,从而使开发变得更为简单。通常情况下,一个页面或一个区域都由多个组件组成,每个组件可以自行维护自身的状态和逻辑,使得组件之间的通讯和协作更加简单和灵活。 Vue组件的使用 全局组件 全局组件可以在应用…

    Vue 2023年5月27日
    00
  • Vue3+TS实现数字滚动效果CountTo组件

    下面我将为您详细讲解“Vue3+TS实现数字滚动效果CountTo组件”的完整攻略。 1. 项目背景 数字滚动效果在 web 开发中经常用于展示数据增量或者倒计时情况,通过 CountTo 组件,我们可以方便地实现数字滚动动画效果。本文以 Vue3 和 TypeScript 的方式实现该组件。 2. 技术选型 CountTo 组件的实现需要使用到 Vue3 …

    Vue 2023年5月27日
    00
  • ant design vue中日期选择框混合时间选择器的用法说明

    Sure!下面是详细的攻略说明: 标题 ant design vue中日期选择框混合时间选择器的用法说明 简介 ant design vue是一个基于Vue的UI框架,其中日期选择框(DatePicker)是常见的一个组件。除了日期选择之外,DatePicker还可以选择时间。本文将详细介绍如何在DatePicker中使用时间选择器。 步骤 在DatePic…

    Vue 2023年5月29日
    00
  • mpvue项目中使用第三方UI组件库的方法

    使用第三方UI组件库可以使我们在mpvue项目中快速开发页面、提高开发效率。下面是mpvue项目中使用第三方UI组件库的方法: 1. 安装第三方UI组件库 在mpvue项目中使用第三方UI组件库,需要先使用npm安装组件库。 以vant组件库为例,安装命令如下: npm i vant -S 2. 引入组件库 安装完成后,在需要使用的页面或组件中引入组件库: …

    Vue 2023年5月27日
    00
  • Promise改写获取萤石云直播地址接口示例

    下面是关于“Promise改写获取萤石云直播地址接口示例”的完整攻略: 什么是Promise Promise是一种基于回调函数的异步编程解决方案,可以简化嵌套回调函数的代码,使异步代码更易读、更易维护和扩展。 要理解Promise的运作流程,需要了解Promise有三种状态:Pending(进行中)、Fulfilled(已完成)和Rejected(已失败)。…

    Vue 2023年5月28日
    00
  • 新手快速入门JavaScript装饰者模式与AOP

    一、JavaScript装饰者模式 什么是装饰者模式 装饰者模式是一种结构型的设计模式,它可以在运行时动态地给对象添加额外的行为,而不是通过修改类的定义或者继承来实现扩展。在实际开发中,装饰者模式常常被用来实现切面编程(AOP)和链式调用,以及对现有类的功能增强、聚合、缓存等实现。 装饰者模式的优缺点 优点 装饰者模式允许动态地添加功能,比继承更加灵活。 装…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部