当前位置: 首页 > article >正文

青少年编程与数学 02-006 前端开发框架VUE 10课题、侦听器

青少年编程与数学 02-006 前端开发框架VUE 10课题、侦听器

  • 一、侦听器
      • 侦听器的作用
      • 使用侦听器
      • 侦听器选项
      • 侦听器与计算属性的区别
      • 侦听器的清理
  • 二、发生优化
  • 三、应用示例
      • `App.vue`

课题摘要:本文介绍了Vue.js中的侦听器(Watchers),这是一种观察和响应数据变动的机制。侦听器可以用于执行副作用、同步数据和执行昂贵的计算。在Vue 3的组合式API中,通过watch函数创建侦听器,它接受观察的数据源和变化时执行的回调函数。侦听器选项允许配置立即触发和深度侦听。与计算属性不同,侦听器不是缓存的,每次数据变化都会执行回调函数。侦听器提供了停止侦听的函数,用于在适当时候停止侦听。文章还讨论了优化侦听器性能的方法,包括合理使用计算属性、防抖和节流、避免不必要的侦听、深度侦听和立即执行、避免复杂计算和分解复杂侦听逻辑。最后,通过一个用户信息表单的示例,展示了如何使用侦听器响应用户名和邮箱的变化。


一、侦听器

在 Vue.js 中,侦听器(Watchers)是一种用于观察和响应 Vue 实例上的数据变动的机制。侦听器可以观察几乎所有类型的数据,包括数据对象上的属性、数组索引、对象属性等。当被观察的数据发生变化时,侦听器会自动触发回调函数。

侦听器的作用

侦听器主要用于以下场景:

  1. 执行副作用:当数据变化时,执行一些需要响应数据变化的操作,比如 API 调用、路由导航、订阅或取消订阅等。

  2. 同步数据:在数据变化时,同步或合并来自不同来源的数据。

  3. 执行昂贵的计算:当需要根据多个数据属性计算派生状态时,而不是使用计算属性,可以选择使用侦听器。

使用侦听器

在 Vue 3 的组合式 API 中,侦听器通过 watch 函数创建。watch 函数接受两个参数:第一个是要观察的数据源,第二个是当数据变化时执行的回调函数。

import { watch } from 'vue';

// 观察一个响应式引用
const state = ref(0);
watch(state, (newValue, oldValue) => {
  console.log(`state changed from ${oldValue} to ${newValue}`);
});

// 观察一个计算属性或响应式属性
const doubledState = computed(() => state.value * 2);
watch(doubledState, (newValue, oldValue) => {
  console.log(`doubledState changed from ${oldValue} to ${newValue}`);
});

侦听器选项

watch 函数还可以接受一个选项对象作为第三个参数,这个选项对象允许你配置立即触发回调函数、侦听深度等。

watch(
  () => state.value,
  {
    immediate: true, // 立即触发回调函数
    deep: true // 深度侦听对象内部的变化
  },
  (newValue, oldValue) => {
    console.log(`state changed from ${oldValue} to ${newValue}`);
  }
);

侦听器与计算属性的区别

  • 计算属性:是基于它们的响应式依赖进行缓存的。只有当依赖的数据变化时,计算属性才会重新计算。适合用于模板中,因为它们是响应式的。
  • 侦听器:不是缓存的,每次观察的数据变化时都会执行回调函数。适合用于执行副作用,因为它们可以访问变化前后的值。

侦听器的清理

watch 函数返回一个停止侦听的函数,你可以在组件卸载或其他适当的时候调用它来停止侦听。

const stopWatching = watch(state, (newValue, oldValue) => {
  // ...
});

// 停止侦听
stopWatching();

侦听器是 Vue 中一个强大的特性,它允许开发者精确地控制数据变化时的行为,使得应用的状态管理更加灵活和响应式。

二、发生优化

在 Vue 中,优化侦听器的性能可以通过以下几种方式实现:

  1. 合理使用计算属性

    • 计算属性是基于它们的响应式依赖进行缓存的,只有当依赖的数据发生变化时,计算属性才会重新计算。因此,如果某个操作可以被缓存,应该优先使用计算属性而不是侦听器,这样可以避免不必要的计算和性能损耗。
  2. 防抖和节流

    • 在处理频繁触发的事件(如输入框的 input 事件)时,使用防抖(Debounce)和节流(Throttle)可以有效减少不必要的计算和请求,提升性能。
  3. 避免不必要的侦听

    • 只侦听必要的数据源。不必要的侦听会增加计算负担,影响性能。
  4. 深度侦听和立即执行

    • 使用 deep: true 选项进行深度侦听,以及使用 immediate: true 选项在组件创建后立即执行侦听器,这样可以更精确地控制侦听器的行为,减少不必要的性能开销。
  5. 避免在侦听器中执行复杂的计算或操作

    • 因为侦听器没有缓存机制,每次数据变化都会触发侦听器,所以在侦听器中执行复杂的计算或操作会影响性能。
  6. 使用 computed 属性代替 watch

    • 如果一个操作可以被缓存,那么应该优先使用计算属性而不是侦听器,这样可以减少不必要的计算。
  7. 分解复杂侦听逻辑

    • 对于复杂的侦听逻辑,可以将其分解为多个简单的侦听器,以便更好地管理和优化性能。
  8. 利用 Vue Devtools 进行性能分析

    • 使用 Vue Devtools 的性能面板来分析组件的渲染时间和更新时间,通过时间线视图查看应用在运行时的性能表现,包括组件的渲染和更新,从而识别性能瓶颈。

通过上述方法,可以有效地优化 Vue 中侦听器的性能,提升应用的响应速度和可维护性。

三、应用示例

下面是一个使用 Vue 3 组合式 API 的完整项目示例,其中包含了侦听器。这个示例是一个简单的用户信息表单,它使用 watch 来侦听用户名和邮箱的变化,并在控制台中打印出变化的信息。

App.vue

<template>
  <div>
    <h1>User Information</h1>
    <input type="text" v-model="userInfo.username" placeholder="Username" />
    <input type="email" v-model="userInfo.email" placeholder="Email" />
    <p>Username has been changed to: {{ userInfo.username }}</p>
    <p>Email has been changed to: {{ userInfo.email }}</p>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';

const userInfo = ref({
  username: '',
  email: ''
});

// 侦听 userInfo.username 的变化
watch(() => userInfo.value.username, (newValue, oldValue) => {
  console.log(`Username changed from ${oldValue} to ${newValue}`);
});

// 侦听 userInfo.email 的变化
watch(() => userInfo.value.email, (newValue, oldValue) => {
  console.log(`Email changed from ${oldValue} to ${newValue}`);
});
</script>

<style>
/* 样式可以根据需要添加 */
input {
  margin: 10px 0;
  padding: 8px;
  width: 100%;
}
</style>

在这个示例中:

  • 使用 ref 创建了一个响应式对象 userInfo,它包含两个属性:usernameemail
  • 使用 v-model 实现了输入框的双向数据绑定。
  • 使用 watch 创建了两个侦听器,分别侦听 userInfo.usernameuserInfo.email 的变化。
  • usernameemail 发生变化时,侦听器的回调函数会被触发,并在控制台中打印出变化的信息。

这个示例展示了如何使用 Vue 3 的组合式 API 和侦听器来响应数据的变化。通过侦听器,你可以在数据变化时执行特定的操作,例如表单验证、数据同步等。


http://www.kler.cn/a/472226.html

相关文章:

  • n 维数组(张量)关于轴 axis 的理解
  • MATLAB语言的正则表达式
  • PySide6的样式表
  • 119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR
  • 【WPF】使用BitmapImage给Image的Source赋值,并释放原占用资源,避免删除原文件时导致程序崩溃
  • uni-app 资源引用(绝对路径和相对路径)方法汇总
  • STM32-笔记35-DMA(直接存储器访问)
  • Approaching a Chatbot Service - Part 3: Bot Model
  • flask后端开发(13):登录功能后端实现和钩子函数
  • 扩散模型论文概述(三):Stability AI系列工作【学习笔记】
  • 基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS
  • 关于常见的负载均衡方法都有什么?
  • labelme转yolo格式
  • 计算机网络 (23)IP层转发分组的过程
  • R语言的循环实现
  • 前端开发 vue 中如何实现 u-form 多个form表单同时校验
  • Estimator (Statistic for Machine Learning)
  • 深入探讨 Android 中的 AlarmManager:定时任务调度及优化实践
  • AI赋能房地产:利用AI前端技术提升VR/AR浏览体验
  • IO模型与NIO基础
  • 【Uniapp-Vue3】v-if条件渲染及v-show的选择对比
  • 第07章 存储管理(一)
  • 第82期 | GPTSecurity周报
  • 基于Vite+TS初始项目 | 不断更新
  • vue 项目集成 electron 和 electron 打包及环境配置
  • 基于R语言的DICE模型