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中 this.$set的用法详解

    当我们在Vue中对数据进行修改时,通常需要使用Vue提供的响应式API对数据进行处理,例如使用Vue.set或this.$set方法。其中,this.$set方法可以让我们在Vue实例上添加一个响应式的属性,同时触发视图的重新渲染。下面我们来详细讲解Vue中this.$set的用法。 如何使用this.$set方法? this.$set方法的使用方法非常简单…

    Vue 2023年5月29日
    00
  • Vue源码学习记录之手写vm.$mount方法

    下面我详细讲解一下 “Vue源码学习记录之手写vm.$mount方法” 的完整攻略,包括如下几个步骤: 1. 确定学习目标 在学习Vue源码的过程中,我们需要了解Vue内部的一些实现细节。这个过程并不简单,我们需要先确定学习目标,才能有系统地学习。在这里,我们的学习目标就是手写 Vue 中的 vm.$mount() 方法。 2. 阅读官方文档 Vue 官网提…

    Vue 2023年5月29日
    00
  • 手写vite插件教程示例

    首先,我们需要明确几个概念: Vite:一款轻量、快速的 Web 开发构建工具。 插件(Plugin):能够扩展 Vite 的功能,增强开发体验。 下面是手写 Vite 插件的完整攻略: 1. 确定插件需求 在开始编写插件之前,我们要先明确需要实现的功能。可以查看 Vite 的官方插件文档,进行参考和借鉴。例如,我们想要编写一个 Vite 插件来自动添加时间…

    Vue 2023年5月27日
    00
  • vue 2.1.3 实时显示当前时间,每秒更新的方法

    下面是针对“vue 2.1.3 实时显示当前时间,每秒更新的方法”的完整攻略。 步骤一:安装moment.js 要在Vue 2.1.3中实现实时显示当前时间,我们需要使用一个JavaScript库moment.js。moment.js是一个JavaScript时间处理库,可以被用来解析、验证、操作和格式化日期对象。要使用moment.js,我们需要先在我们的…

    Vue 2023年5月29日
    00
  • 对vue里函数的调用顺序介绍

    接下来我会详细讲解“对vue里函数的调用顺序介绍”的完整攻略。 1. Vue函数的调用顺序 Vue中的函数调用顺序有如下几种情况: beforeCreate(创建前): 这个阶段会在Vue实例初始化之后,数据观测之前被调用。在此阶段,我们无法访问到 data、computed、methods、watch中的任何属性。 created(创建后): 该阶段在实例…

    Vue 2023年5月28日
    00
  • vue2单元测试环境搭建

    Vue2单元测试环境搭建 单元测试是为了保证代码质量而必要的步骤。Vue2的单元测试环境搭建涉及的技术包括mocha、chai、sinon等。本文将详细讲述Vue2单元测试环境搭建的步骤和示例。 步骤 安装依赖 首先需要安装mocha、chai、sinon和vue-test-utils等依赖。 npm install –save-dev mocha cha…

    Vue 2023年5月28日
    00
  • Vue中通过Vue.extend动态创建实例的方法

    让我来为您讲解一下在Vue中通过Vue.extend动态创建实例的方法。 Vue.extend方法 Vue.extend方法是Vue的一个全局API,用于创建一个Vue组件构造器,并返回该构造器。通过Vue.extend方法创建的组件构造器可以像普通的Vue组件一样进行注册、传值、生命周期等操作。 创建Vue组件构造器 首先我们需要通过Vue.extend方…

    Vue 2023年5月28日
    00
  • Vue实现点击按钮下载文件的操作代码(后端Java)

    下面是详细讲解“Vue实现点击按钮下载文件的操作代码(后端Java)”的完整攻略: 1. 前端实现 1.1 创建下载按钮 首先,在Vue的组件中添加一个按钮,用来触发下载操作: <template> <div> <button @click="downloadFile">下载文件</button&…

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