浅谈 vue 中的 watcher

关于“浅谈 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+ts中ref与reactive指定类型实现示例

    下面我将为你详细讲解“vue3+ts中ref与reactive指定类型实现示例”的完整攻略。 一、Ref 1.1 简介 在 Vue 3 中,ref 是一个函数,它可以创建一个响应式数据,ref 函数返回一个对象,对象中包含着响应式数据的值。 1.2 使用 使用 ref 创建响应式数据的格式如下: import { ref } from ‘vue’; cons…

    Vue 2023年5月27日
    00
  • 微信小程序实战基于vue2实现瀑布流的代码实例

    为了更好地讲解微信小程序实战基于vue2实现瀑布流的代码实例,我们可以按照以下步骤展开: 1. 准备工作 首先需要在本地安装 Vue-cli 和 Weex-toolkit,打开命令行窗口,输入以下命令进行安装。 npm install -g vue-cli npm install -g weex-toolkit 2. 创建项目 接着,在命令行窗口中输入以下命…

    Vue 2023年5月27日
    00
  • 使用Vue实现简单日历效果

    下面就是使用Vue实现简单日历效果的完整攻略: 1. 创建Vue项目 首先需要通过Vue CLI工具创建一个Vue项目,具体步骤在这里就不详细阐述了,如果不熟悉Vue CLI的使用,可以参考Vue CLI文档。 2. 安装依赖 在创建好Vue项目之后,需要安装一些依赖,在项目根目录下运行以下命令: npm install moment –save 这里我们…

    Vue 2023年5月29日
    00
  • vue实现垂直无限滑动日历组件

    首先,我们需要明确一下“垂直无限滑动日历组件”的概念。它是一种可以在垂直方向上无限滑动的日历组件,可以根据用户的手势操作,实现不同日期之间的切换,并且在切换时能够保持连续的滑动效果。在这个过程中,我们需要用到Vue框架,并且借助一些第三方工具来实现这个组件。 下面是实现这个组件的详细攻略: 1. 安装必要的第三方库 在Vue中,我们可以使用vue-cli来创…

    Vue 2023年5月29日
    00
  • 一文搞懂Vue3中toRef和toRefs函数的使用

    一文搞懂Vue3中toRef和toRefs函数的使用 Vue3引入了toRef和toRefs函数,可以让我们更加便捷地操作和使用响应式数据。下面来详细讲解一下它们的使用方法。 toRef函数 toRef函数可以将一个响应式对象的属性转化为一个ref对象,使得这个属性可以被“单独响应”。 用法 const { toRef } = Vue3; const obj…

    Vue 2023年5月28日
    00
  • 如何在 Vue 中使用 Axios 异步请求API

    下面我来详细讲解一下如何在 Vue 中使用 Axios 异步请求 API 的完整攻略。 1. 安装 Axios 在使用 Axios 之前,我们需要先安装它。可以通过 npm 安装: npm install axios –save 或者通过 yarn 安装: yarn add axios 2. 在 Vue 中使用 Axios 在 Vue 中使用 Axios …

    Vue 2023年5月28日
    00
  • 带你一文了解Vue生命周期钩子

    带你一文了解Vue生命周期钩子 Vue生命周期钩子是指Vue在组件实例化、数据更新、渲染页面等不同阶段执行的方法。这些钩子函数对于理解Vue的生命周期非常重要,因为他们使得我们有机会在特定时间节点执行自己的代码。 Vue生命周期的三个阶段 Vue的生命周期可以分为三个主要的阶段: 创建阶段(Creation):在这个阶段Vue实例化组件、设置数据观测、初始化…

    Vue 2023年5月27日
    00
  • 关于Vue不能监听(watch)数组变化的解决方法

    讲解“关于Vue不能监听(watch)数组变化的解决方法”的完整攻略分为以下几个部分: 问题背景 解决方法一:使用Vue提供的$set方法 解决方法二:使用深度监听watch 示例说明1:使用$set方法动态添加数组元素 示例说明2:使用深度监听watch监听数组变化 1. 问题背景 在Vue中,数组是一种重要的数据类型,但其本身是无法触发响应,也就无法直接…

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