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

yizhihongxing

关于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组件watch属性实例讲解

    下面来详细讲解一下“Vue组件watch属性实例讲解”的完整攻略。 1. watch属性简介 在 Vue 组件中,watch 属性是用于监听数据变化并作出相应行为的一种功能。通俗的说,就是当我们需要对某个数据进行监听,并且当数据发生变化时,希望自动执行一些操作,那么就可以使用 watch 属性。 2. watch属性的基础使用 watch 属性的基础使用格式…

    Vue 2023年5月29日
    00
  • Vue程序调试的方法

    下面是Vue程序调试的完整攻略,包含以下内容: 使用Chrome浏览器的开发者工具进行调试 使用Vue.js官方提供的调试工具Vue.js DevTools 在代码中使用console.log()进行调试 使用断点进行逐行调试 1. 使用Chrome浏览器的开发者工具进行调试 Chrome浏览器的开发者工具内置了强大的调试工具,可以方便地调试Vue程序。在使…

    Vue 2023年5月27日
    00
  • Vue props传入function时的this指向问题解读

    Vue.js是一款优秀的前端开发MVVM框架,其中props在组件之间传递数据是非常常见的,但是当我们在props中传递function时,可能会存在this指向的问题。本篇攻略将为大家详细讲解“Vue props传入function时的this指向问题解读”。 问题背景 在Vue.js中,使用props传递函数时,如果该函数需要用到父组件的数据或方法,就需…

    Vue 2023年5月28日
    00
  • vue使用axios上传文件(FormData)的方法

    下面是详细的Vue使用axios上传文件(FormData)的方法攻略: 1. 安装axios库 首先需要在Vue项目中安装axios库,可以通过npm命令进行安装: npm install axios –save 2. 引入axios库 在Vue的组件中引入axios库的方法如下: import axios from ‘axios’ 3. 创建FormD…

    Vue 2023年5月28日
    00
  • 使用Mockjs模拟接口实现增删改查、分页及多条件查询

    使用Mockjs模拟接口实现增删改查、分页及多条件查询可以分为以下步骤: 安装Mock.js库 使用npm安装Mock.js库:npm install mockjs –save-dev 创建Mock接口数据 在项目中创建一个mock文件夹,其中的api.js文件用于存放Mock接口数据,具体代码如下: import Mock from ‘mockjs’ c…

    Vue 2023年5月27日
    00
  • vue中使用Axios最佳实践方式

    下面就是关于”vue中使用Axios最佳实践方式”的完整攻略: 确定请求的方式 在使用Axios时,我们需要确定请求的方式,可以使用get、post、put、delete等方式,同一个接口的不同请求方式可以得到不同的数据。如需向后端发起请求,需要在axios对象中添加请求方式,具体操作如下: import axios from ‘axios’ // 设置请求…

    Vue 2023年5月28日
    00
  • vue 大文件分片上传(断点续传、并发上传、秒传)

    Vue 大文件分片上传是前端文件上传中常见的解决方案之一,用于解决大文件上传时可能遇到的性能和稳定性问题。常见的性能问题包括上传时间过长、上传失败等,而稳定性问题则是在上传过程中可能因为网络原因导致上传失败,需要支持断点续传。 什么是文件分片上传?文件分片上传是指将大文件分成多个较小的文件片段进行上传,上传完成后再将这些片段组合成完整的文件。这样做的好处是文…

    Vue 2023年5月28日
    00
  • vue的diff算法知识点总结

    下面是针对“vue的diff算法知识点总结”的完整攻略。 什么是Vue的diff算法 Vue.js是一种高效的UI框架,它利用Virtual DOM(虚拟DOM)技术来实现快速渲染和更新视图。而Vue的diff算法就是为了在Virtual DOM的基础上,更高效地进行视图更新而设计的。 Vue的diff算法的主要思路 Vue的diff算法主要采用的是“先序深…

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