浅谈 vue 中的 watcher

yizhihongxing

关于“浅谈 Vue 中的 Watcher”,我将分以下几个部分来详细阐述。

Watcher 概述

在 Vue 中,Watcher 是一个可以观察并响应数据变化的对象。当数据变化时,Watcher 会自动重新渲染视图。

在 Vue 中有三种 Watcher:Computed Watcher、User Watcher 和渲染 Watcher。其中,Computed Watcher 和 User Watcher 都可以手动创建,而渲染 Watcher 是 Vue 内部自动创建的。

创建 Watcher 的方式

  1. Computed Watcher

Computed Watcher 是通过 computed 属性来创建的,在模板中使用 computed 的值,并不直接使用数据,因为 computed 属性支持缓存,只有相关的数据改变了,computed 才会重新计算。下面是一个例子:

<template>
  <div>
    <p>num1: {{ num1 }}</p>
    <p>num2: {{ num2 }}</p>
    <p>computed: {{ computedNum }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      num1: 1,
      num2: 2
    };
  },
  computed: {
    computedNum() {
      console.log('computed');
      return this.num1 + this.num2;
    }
  }
};
</script>

上面的代码中,computedNum 就是一个 Computed Watcher。

  1. User Watcher

User Watcher 是通过使用 $watch API 创建的,不同于 computed 属性,使用 $watch API 创建的 Watcher 并没有缓存功能。下面是一个例子:

<template>
  <div>
    <p>num1: {{ num1 }}</p>
    <p>num2: {{ num2 }}</p>
    <p>userWatcher: {{ userWatcher }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      num1: 1,
      num2: 2,
      userWatcher: ''
    };
  },
  created() {
    this.$watch(
      function () {
        return this.num1 + this.num2;
      },
      function (newValue, oldValue) {
        console.log('userWatcher');
        this.userWatcher = newValue;
      }
    );
  }
};
</script>

上面的代码中,使用 $watch API 创建了一个 User Watcher,它会观察 num1 和 num2 的变化。

Watcher 的原理

Watcher 本质上是一个订阅者,会在数据变化时接收通知,并采取相应的操作。

在 Vue 的实现中,当数据改变时,会触发一个派发更新的操作,派发的更新会通知所有使用了此数据的 Watcher 执行更新视图的操作。同时,Watchers 之间也会建立起一定的依赖,也就是所谓的依赖收集。

以下是一个 Watcher 的简单示例:

class Watcher {
  constructor(data, key, cb) {
    this.data = data;
    this.key = key;
    this.cb = cb;
    this.value = this.get();
  }
  get() {
    Dep.target = this;
    const value = this.data[this.key];
    Dep.target = null;
    return value;
  }
  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.cb(this.value, oldValue);
  }
}

以上是一个简单的 Watcher 实现代码,其中,Dep 是一个被观察者的数据存储器。

Watcher 的实际使用场景

  1. 监听 Form 表单输入框的数据,进行校验
<template>
  <form>
    <input type="text" v-model="username" />
    <input type="password" v-model="password" />
    <button :disabled="!formValid">Sign in</button>
  </form>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  computed: {
    formValid() {
      console.log('formValid computed');
      return this.username && this.password;
    }
  },
  watch: {
    formValid: {
      handler(newValue, oldValue) {
        console.log('formValid watch');
      }
    }
  }
};
</script>
  1. 监听 Array 类型数据的变化
<template>
  <div>
    <ul>
      <li v-for="(item, index) in list" :key="index">{{ item }}</li>
    </ul>
    <button @click="changeList">修改</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: ['apple', 'banana', 'orange']
    };
  },
  methods: {
    changeList() {
      this.list.push('watermelon');
      this.list.splice(0, 1);
    },
    watch: {
      list(newValue, oldValue) {
        console.log('list watch');
      }
    }
  }
};
</script>

以上是 Watcher 在 Vue 中的一些使用场景和实现原理的详细讲解。希望能对你有帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈 vue 中的 watcher - Python技术站

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

相关文章

  • Vue3属性绑定方法解析

    Vue3属性绑定方法解析 Vue3提供了更加优雅的属性绑定方法,让属性绑定更加简单灵活。本篇文章将会详细讲解Vue3属性绑定的方法。 描述 在Vue3中,你可以直接使用 v-bind: 或 : 来进行属性绑定,语法和Vue2中的一样。但是,Vue3还提供了另一种方式,使用 : 来替代 v-bind: 。即:将 v-bind: 缩写为 : ,这使得Vue3的属…

    Vue 2023年5月28日
    00
  • vue 路由懒加载详情

    Vue路由懒加载是一种优化技术,可以大幅提高Vue应用程序的性能。当使用Vue路由懒加载时,只有在需要用到相应组件时才会下载其代码。本文将提供Vue路由懒加载的详细攻略,以及两个示例说明。 什么是路由懒加载 Vue是一个单页应用程序框架,使用路由可以在不同页面之间切换。通过路由懒加载,可以优化Vue应用程序的性能,因为当用户进入特定页面时,只有该页面所需组件…

    Vue 2023年5月28日
    00
  • vue清空form对象的方法

    当我们使用Vue框架开发前端应用时,经常需要将前端表单数据绑定到Vue实例属性,但是在一些场景中,当我们需要清空这些表单数据时,可以使用以下两种方法: 方法一:重新创建Vue实例 在一些简单的应用中,我们可以通过重新创建Vue实例来清空表单数据,示例代码如下: <template> <div> <input type=&quot…

    Vue 2023年5月28日
    00
  • 原生js实现可兼容PC和移动端的拖动滑块功能详解【测试可用】

    【标题】原生js实现可兼容PC和移动端的拖动滑块功能详解 【简介】本文将详细讲解如何使用原生JS实现可兼容PC和移动端的拖动滑块功能,这对于一些需要用户进行数值选择的网站或应用非常有用。 【具体步骤】 HTML部分 为了实现滑块功能,我们需要在HTML中创建一个滑块的DOM元素,具体代码如下: <div class="slider-conta…

    Vue 2023年5月28日
    00
  • VUE响应式原理的实现详解

    VUE响应式原理的实现详解 介绍 VUE是一个MVVM模式的渐进式框架,其中响应式是VUE的核心特性之一,使得数据与界面保持同步,大大提高了开发效率。本文将阐述VUE响应式原理的实现,帮助读者更加深入理解VUE框架。 数据劫持 VUE的响应式实现依赖于ES5的get和set方法。在一个对象被创建时,遍历对象上的所有属性,将其转化为getter/setter,…

    Vue 2023年5月27日
    00
  • vuex进阶知识点巩固

    关于 “vuex进阶知识点巩固” 的完整攻略,我将按照以下几个方面进行详细讲解: Vuex的基本概念 Vuex的核心概念 Vuex的高级应用 1. Vuex的基本概念 1.1 什么是Vuex? Vuex是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,将组件的共享状态抽取出来,以一个全局单例模式管理。 1.2 V…

    Vue 2023年5月28日
    00
  • vue简单练习 桌面时钟的实现代码实例

    下面是关于“vue简单练习 桌面时钟的实现代码实例”的完整攻略。 一、实现时钟的HTML结构 首先,我们需要在HTML中添加一个 元素,用来展示时钟: <div id="app"> <h1>Vue 时钟</h1> <div class="clock"> <span …

    Vue 2023年5月29日
    00
  • 浅谈Vue数据响应

    浅谈Vue数据响应 Vue作为一款现代化的前端框架,在数据响应方面使用了响应式编程的思想,以方便开发者管理数据。在本文中,我们将深入探讨Vue数据响应的相关知识。 什么是Vue数据响应 Vue数据响应是指当Vue的组件状态(data)发生变化时,视图自动更新。Vue通过使用响应式的观察者模式实现数据和UI的双向绑定(Two-Way-Binding),即当数据…

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