关于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实现简单的星级评分组件源码

    下面详细讲解“vue实现简单的星级评分组件源码”的完整攻略。 步骤一:编写HTML结构 首先,我们需要编写一个HTML结构,来展示星级评分组件。在Vue组件里,我们需要使用template标签,编写类似以下的HTML代码: <template> <span> <i v-for="index in maxScore&qu…

    Vue 2023年5月27日
    00
  • ant design vue datepicker日期选择器中文化操作

    为了在ant design vue datepicker日期选择器中文化操作,你需要以下步骤: 步骤一:安装moment.js和ant-design-vue包 首先,你需要在你的项目中安装moment.js和ant-design-vue: npm install moment ant-design-vue –save 在上面的代码中,我们使用了npm包管理…

    Vue 2023年5月29日
    00
  • 详细聊聊vue中组件的props属性

    下面详细讲解在Vue中组件的props属性的使用攻略: 什么是props属性? props属性是Vue组件中的属性,用以接收父组件传递的数据,并在组件中使用。组件内部不能修改props属性,props属性应该被认为是父组件所有的数据。 如何使用props属性? 在组件中定义props属性 当一个Vue组件中需要接受父组件传递的数据时,应该在组件中定义prop…

    Vue 2023年5月27日
    00
  • Vue的模板语法以及实战案例

    关于 Vue 的模板语法以及实战案例的完整攻略,以下是具体的讲解: Vue 的模板语法 Vue 的模板语法采用了类似于 HTML 的语法,通过将模板中的标签和属性绑定到数据模型中实现了动态渲染页面的效果。具体来说,Vue 的模板语法主要包括以下几个方面: 支持的指令 v-if:条件语句,根据表达式的值选择是否渲染元素。 v-for:循环语句,用于渲染列表或集…

    Vue 2023年5月27日
    00
  • vue组件中使用props传递数据的实例详解

    那么就开始详细讲解“vue组件中使用props传递数据的实例详解”吧。 什么是props 在Vue中,父组件可以通过props向子组件传递数据,子组件接收props后在组件内部使用这些数据。props是short for“properties”,它可以传递任何类型的数据,包括字符串、数字、数组、对象等等。 基本用法示例 假设我们有一个父组件parent和一个…

    Vue 2023年5月27日
    00
  • vue3+vite使用环境变量.env的一些配置情况详细说明

    下面是关于”vue3+vite使用环境变量.env的一些配置情况详细说明”的完整攻略。 简介 在Vue3和Vite开发环境中,使用环境变量可助力于管理不同的配置文件,例如本地开发环境、生产环境等。 当我们需要在不同的环境中配置不同的API地址、配置信息等时,使用环境变量便能够让我们的代码变得更加灵活通用。在这里,我们将详细说明如何在Vue3+Vite项目中使…

    Vue 2023年5月28日
    00
  • Vue axios 将传递的json数据转为form data的例子

    当我们使用 Vue.js 和 axios 进行数据交互时,通常会使用 JSON 数据格式来传递数据。但在某些情况下,我们需要将 JSON 数据转换成 FormData 格式,例如在使用 Form 表单上传文件时。下面是一个 Vue axios 将传递的 JSON 数据转为 FormData 的例子: 步骤一:安装 axios 首先需要安装 axios,可以使…

    Vue 2023年5月28日
    00
  • Vant主题定制如何修改颜色样式

    下面是关于Vant主题定制如何修改颜色样式的完整攻略,过程中包含两条示例说明。 确定主题颜色 首先,我们需要确定用于主题的颜色。可以到Vant的文档中查看可用的颜色变量。例如,有三个颜色变量 $van-primary-color、$van-success-color、$van-danger-color,它们分别对应了主色、成功、危险的颜色。 修改颜色 接下来…

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