Vue watch原理源码层深入讲解

Vue watch原理源码层深入讲解

概述

在Vue中,watch表示当数据变化时需要执行的操作。Vue通过watch实现了响应式更新数据的机制,并提供了watch方法供开发者使用。

watch方法的使用非常灵活,可以监视对象、数组、深层属性等复杂类型的数据。本篇文章主要从源码层面深入解析Vue watch的实现原理,以及watch的应用示例。

Vue watch的原理

在Vue代码中,watch的实现依赖于一个Watcher类和纯函数createWatcher。

Watcher类是Vue watch机制的核心,它实现了响应式的检测与通知。当监听的数据改变时,会触发Watcher实例的update方法进行更新,也就是通知Dep(Dependency)依赖的数据发生变化了。

Dep类是Watcher依赖的容器,保存了Watcher所依赖的数据源。当Watcher需要更新时,Dep会把Watcher放入一个队列中,并在后续遍历时遍历这个队列依次执行Watcher的更新方法。这就保证了所有Watcher的顺序性,从而避免了因数据更新导致的依赖关系错误。

createWatcher函数是负责watch的定义,它接收三个参数:vm(Vue实例)、expOrFn(需要监控的函数表达式或深度侦听的属性路径)、cb(当监控的表达式发生变化时的回调函数),返回一个Watcher实例。

Watcher实例所依赖的数据源是expOrFn返回的返回值。当expOrFn返回的返回值发生变化,Watcher实例就会被触发,从而执行回调函数cb。

使用示例

以下是两个watch的示例:

  1. 监听对象
//监听一个对象obj
watch: {
    obj: {
        handler: function(newVal, oldVal) {
            console.log('obj changed!', 'new:', newVal, 'old:', oldVal)
        },
        deep: true
    }
}
  1. 监听组件属性
export default {
  data () {
    return {
      firstName: 'Jing',
      lastName: 'Wang'
    }
  },
  watch: {
    firstName: function (newVal, oldVal) {
      console.log(newVal + ' ' + this.lastName)
    },
    lastName: function (newVal, oldVal) {
      console.log(this.firstName + ' ' + newVal)
    }
  }
}

以上两个示例分别演示了watch对对象和组件属性的监听。通过对watch原理的深入分析,我们可以更好地理解watch的实现原理,从而更好地使用Vue提供的监控机制。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue watch原理源码层深入讲解 - Python技术站

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

相关文章

  • vue如何修改data中的obj数据的属性

    修改Vue中data对象中的属性是一个基本的功能,而访问深度嵌套的对象时可能略有不同。下面是使用Vue修改data中嵌套对象属性的攻略: 访问对象中的嵌套属性 假设我们有以下data对象: data() { return { user: { id: 1, name: ‘张三’, address: { city: ‘北京’, street: ‘朝阳区’ } }…

    Vue 2023年5月28日
    00
  • Vue中在data里面调用method方法的实现

    在Vue中,我们可以在组件的data选项中定义数据,并且我们可以使用methods来定义方法。通常情况下,我们使用methods中的方法来操作组件数据。但是,有时我们需要在data中调用methods的方法。这时,可以使用this.$options.methods来访问methods中定义的方法。 下面是Vue中在data里面调用method方法的实现的完整…

    Vue 2023年5月28日
    00
  • Vue在自定义指令绑定的处理函数中传递参数

    自定义指令在Vue中是一个很实用的特性,可以用于很多场景,例如对表单数据的自动验证,在DOM元素渲染前做一些操作等。 在开发过程中,我们有时需要在自定义指令的绑定处理函数中传递一些参数,来实现更加灵活多样的功能。那么如何在Vue自定义指令中传递参数呢? 下面是两个实例说明: 实例1:传递固定的参数 如果我们要在自定义指令中传递一些固定的参数,例如一个字符串,…

    Vue 2023年5月28日
    00
  • Vue打包后访问静态资源路径问题

    Vue是一种流行的JavaScript框架,用于构建交互式的现代Web应用程序。Vue的打包可以将应用程序的所有资源(例如HTML,JavaScript,CSS和图像)打包成几个文件,使应用程序易于部署。但是,Vue打包后,用户在访问应用程序时可能会遇到静态资源路径问题。为解决这一问题,我们可以采用以下攻略: 问题描述 Vue打包后,由于路径设置不正确,可能…

    Vue 2023年5月28日
    00
  • Vue 如何追踪数据变化

    Vue 是一个数据驱动的MVVM框架,其数据变化追踪机制可以让开发者非常方便地进行可靠的开发。Vue 如何追踪数据变化呢?下面是一些关于 Vue 数据变化追踪机制的详细描述。 1. 响应式数据 Vue 中的数据变化追踪是通过”响应式数据”这一概念实现的。所谓”响应式数据”,就是在Vue的实例化过程中,通过对数据进行代理实现当数据发生变化时,及时通知修改监听器…

    Vue 2023年5月28日
    00
  • Vue 中 createElement 使用实例详解

    下面我给出“Vue 中createElement 使用实例详解”的完整攻略,包括基本语法和两条示例说明。 What is createElement? createElement 是 Vue 的一个渲染函数,它通过 JavaScript 代码的方式生成虚拟 DOM。通过 createElement 我们能够在 JS 代码中定义 Vue 的组件,从而实现动态渲…

    Vue 2023年5月29日
    00
  • 解决vscode进行vue格式化,会自动补分号和双引号的问题

    下面我将为您详细讲解如何解决 VSCode 进行 Vue 格式化时自动补分号和双引号的问题: 问题分析 在编写 Vue 代码时,我们通常会使用 VSCode 进行格式化,这可以让我们的代码更加美观易读。但是在使用 VSCode 进行 Vue 格式化时,会出现自动补分号和双引号的问题,这对我们的开发和调试带来了很大的不便。 解决方法 针对这个问题,我们可以采用…

    Vue 2023年5月28日
    00
  • mqtt.js 无法连接/错误提示 WebSocket connection to ‘ws://xxxxx‘ failed:的解决方法

    首先,需要了解一下MQTT协议和mqtt.js库。MQTT是一种用于物联网的轻量级协议,基于发布/订阅模式,支持良好的可靠性和低带宽消耗。而mqtt.js是MQTT协议的JavaScript客户端库,可以用于浏览器和Node.js环境下。 当在使用mqtt.js连接MQTT服务器时,出现“WebSocket connection to ‘ws://xxxxx…

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