浅析vue 函数配置项watch及函数 $watch 源码分享

yizhihongxing

浅析 Vue 函数配置项 watch 及函数 $watch

在 Vue.js 中,watch 是一个非常重要的选项。它可以监听数据的变化,从而触发相应的逻辑。本文将从两个方面来介绍 watch:函数配置项 watch 和函数 $watch 的源码分享。

函数配置项 watch

watch 是一个对象,它的属性是要监听的数据的名称,值是一个对象或函数。如果值是一个函数,那么它将会在数据变化时被调用。如果值是一个对象,那么可以定义以下几个选项:

  • handler:数据变化时的回调函数。
  • deep:布尔值,表示是否深度监听。
  • immediate:布尔值,表示是否在绑定时立即执行回调函数。
  • lazy:布尔值,表示是否延迟执行回调函数(即在下一次更新时才执行)。

以下是一个示例,展示了如何在 watch 中使用函数:

new Vue({
  el: '#app',
  data: {
    message: '',
  },
  watch: {
    message: function (newValue, oldValue) {
      console.log('数据变化啦!')
    },
  },
})

在上面的代码中,我们监听了 message 数据的变化,每当 message 发生变化时,就会调用回调函数并打印一段信息。

接下来让我们看看如何使用对象来定义 watch

new Vue({
  el: '#app',
  data: {
    message: {
      text: '',
    },
  },
  watch: {
    message: {
      handler: function (newValue, oldValue) {
        console.log('数据变化啦!')
      },
      deep: true,
    },
  },
})

在上面的代码中,我们监听了 message 数据的变化,并设置了 deep 选项为 true,表示要深度监听 message 中的所有属性。

除了上述选项之外,还可以在对象中定义其他选项,例如:beforeafterfilter等。如果想要了解更多详情,请参考官方文档。

函数 $watch 源码分享

除了使用函数配置项 watch 外,我们还可以使用 $watch 函数来监听数据的变化。这个函数接收三个参数:要监听的数据的名称,回调函数,以及选项对象。

以下是一个示例,展示了如何使用 $watch 函数:

new Vue({
  el: '#app',
  data: {
    message: '',
  },
  created: function () {
    this.$watch('message', function (newValue, oldValue) {
      console.log('数据变化啦!')
    })
  },
})

在上面的代码中,我们在 created 钩子函数中使用 $watch 函数来监听 message 数据的变化。每当 message 数据变化时,回调函数就会被调用。

最后,让我们快速浏览一下 $watch 函数的源码。$watch 函数的定义在 core/instance/state.js 文件中,具体内容如下:

Vue.prototype.$watch = function (expOrFn, cb, options) {
  var vm = this
  options = options || {}
  var watcher = new Watcher(vm, expOrFn, cb, options)
  if (options.immediate) {
    cb.call(vm, watcher.value)
  }
  return function unwatchFn () {
    watcher.teardown()
  }
}

$watch 函数的内部,我们创建了一个新的 watcher 实例,并在必要时执行回调函数。如果 immediate 选项为 true,则会在监听数据时立即执行回调函数。最后,我们返回一个函数用于取消监听数据。

示例说明

示例一

比如说你有一个输入框和一个按钮,当用户在输入框输入文本并点击按钮时,将文本展示到页面上。这时候就可以用 watch 来监听 message 数据的变化,如下所示:

<div id="app">
  <input type="text" v-model="message" />
  <button @click="showMessage">显示消息</button>
  <p>{{ message }}</p>
</div>
new Vue({
  el: '#app',
  data: {
    message: '',
  },
  watch: {
    message: function (newValue, oldValue) {
      console.log('数据变化啦!')
    }
  },
  methods: {
    showMessage: function () {
      alert(this.message)
    }
  },
})

在上面的代码中,我们监听了 message 数据的变化,并在用户输入文本时触发回调函数并打印一条信息。另外,我们还定义了一个 showMessage 方法,当用户点击按钮时,会弹出用户输入的文本。

示例二

比如说你有一个复杂的数据结构,你希望深度监听其属性的变化。这时候就可以使用对象方式来定义 watch,如下所示:

<div id="app">
  <p>{{ message.text }}</p>
</div>
new Vue({
  el: '#app',
  data: {
    message: {
      text: '',
    },
  },
  watch: {
    message: {
      handler: function (newValue, oldValue) {
        console.log('数据变化啦!')
      },
      deep: true,
    },
  },
})

在上面的代码中,我们监听了 message 数据的变化,并设置了 deep 选项为 true,表示要深度监听 message 中的所有属性。每当 message 中的任何属性发生变化时,回调函数就会被执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析vue 函数配置项watch及函数 $watch 源码分享 - Python技术站

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

相关文章

  • Vue3计算属性是如何实现的

    Vue3计算属性是基于Vue3的响应式机制实现的。通过使用计算属性,我们可以根据其他属性的值进行计算并返回一个新的值。以下是实现Vue3计算属性的完整攻略: 1. 编写模板 首先,在模板中定义需要计算的属性,并使用计算属性的名称来获取计算结果。例如,下面的模板演示了如何计算两个属性的和: <template> <div> <p&…

    Vue 2023年5月28日
    00
  • ElementUI Tree 树形控件的使用并给节点添加图标

    ElementUI Tree 树形控件的使用并给节点添加图标 1. ElementUI Tree 树形控件的基本使用 ElementUI Tree 树形控件可以用于展示具有层级关系的数据。下面是使用ElementUI Tree 树形控件的基本流程: 引入 ElementUI 组件库,包括 el-tree 和 el-tree-node 两个组件。 定义数据,格…

    Vue 2023年5月28日
    00
  • 基于vue–key值的特殊用处详解

    基于vue–key值的特殊用处详解 什么是key值? 在Vue.js中,当使用v-for循环一个列表时,每个被循环的DOM元素都需要一个唯一标识,用于Vue的虚拟DOM算法中进行节点的识别和优化。这个唯一标识就是key值。 key值的作用 1. 提高渲染效率 通过key值,Vue可以追踪所有列表中对象的身份,在新旧节点对比时可以精确判断每个节点对应的对象是…

    Vue 2023年5月29日
    00
  • vue项目中轮询状态更改方式(钩子函数)

    在 Vue 项目中,轮询状态更改是一种经常使用的操作,它可以帮助我们动态地更新组件中的数据。Vue 提供了一系列钩子函数,我们可以使用这些钩子函数来实现轮询操作。 以下是实现轮询状态更改的完整攻略: 创建一个定时器 我们可以使用 setInterval() 方法来创建一个定时器,定期执行某个函数。在 Vue 中,我们可以在 mounted() 钩子函数中创建…

    Vue 2023年5月28日
    00
  • vue项目中使用多选框的实例代码

    为了让解释更加清晰,我准备从以下几个方面来讲解: 引入vue的核心库和需要的组件 配置数据源和绑定数据 实现多选功能 示例说明 1. 引入vue的核心库和需要的组件 首先,在vue项目中使用多选框,需要引入vue的核心库和需要的组件: <!– 引入vue的核心库 –> <script src="https://unpkg.co…

    Vue 2023年5月27日
    00
  • vue如何添加数组页面及时显示

    当我们在 Vue 中使用数组时,我们可能需要通过添加或删除元素来更新页面。Vue 提供了一些内置的方法,来处理这些问题。下面就是一些步骤,可以让你在 Vue 中应用这些方法,以及让你了解 Vue 如何添加数组页面及时显示。 步骤一:定义数组 第一步是定义一个数组,你可以在 data 函数中定义数组,也可以将其定义为组件实例的属性。例如,下面是将数组定义为组件…

    Vue 2023年5月28日
    00
  • 详解Java中wait和sleep的区别

    下面我将为大家详细讲解”详解Java中wait和sleep的区别”的完整攻略。 什么是wait和sleep? 在Java中,wait和sleep都是线程等待的方法。它们的作用都是让程序进入等待状态,但是两者还是有一些区别的。 wait和sleep的区别 wait是Object类的方法,而sleep是Thread类的方法。 在调用wait的时候,线程会释放它所…

    Vue 2023年5月28日
    00
  • 利用vuex-persistedstate将vuex本地存储实现

    利用 vuex-persistedstate 可以将 Vuex 状态持久化到本地存储中,目的是为了在页面刷新后还能够保持之前的状态。下面是 vuex-persistedstate 的完整攻略: 安装 在项目目录下执行以下命令安装 vuex-persistedstate: npm install vuex-persistedstate –save 引入 在您…

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