首页 > 其他分享 >Vue.js中的深度监听:理解其工作原理及应用

Vue.js中的深度监听:理解其工作原理及应用

时间:2024-09-25 15:52:19浏览次数:10  
标签:Vue 递归 value js person 深度 监听

在 Vue.js 中,深度监听是指能够监测到对象内部属性变化的能力。默认情况下,Vue 通过数据劫持(data hijacking)来实现响应式系统,这包括了对对象属性的访问和修改进行拦截。但是,这种监听是浅层的,即它只会监听对象本身的属性变化,而不会递归地监听对象内部的属性变化。

深度监听的实现

Vue.js 提供了两种主要的方式来实现深度监听:

  1. 使用 watchdeep 选项
  2. 使用 Object.defineProperty 的递归实现
1. 使用 watchdeep 选项

在 Vue 组件中,你可以使用 watch 选项来监听数据的变化,并通过设置 deep 选项为 true 来启用深度监听。

export default {
  data() {
    return {
      person: {
        name: 'Alice',
        age: 25
      }
    };
  },
  watch: {
    // 监听 person 对象的变化
    person: {
      handler(newValue, oldValue) {
        console.log('person changed:', newValue, oldValue);
      },
      deep: true
    }
  }
}

在这个例子中,当 person 对象中的任何属性发生变化时,handler 函数都会被调用。这意味着如果你改变了 person.nameperson.agewatcher 都会触发。

2. 使用 Object.defineProperty 的递归实现

Vue 内部使用 Object.defineProperty 方法来实现数据的响应式。你可以手动实现一个递归版本的 defineReactive 函数来深入对象内部,使其所有属性都变为响应式的。

function defineReactive(data, key, val) {
  observe(val); // 递归观察内部属性
  Object.defineProperty(data, key, {
    enumerable: true,
    configurable: true,
    get: function reactiveGetter() {
      return val;
    },
    set: function reactiveSetter(newVal) {
      if (newVal === val) return;
      observe(newVal); // 递归观察新的值
      val = newVal;
    }
  });
}

function observe(value) {
  if (!value || typeof value !== 'object') {
    return;
  }
  Object.keys(value).forEach(key => {
    defineReactive(value, key, value[key]);
  });
}

深度监听的应用场景

深度监听在某些场景下非常有用,例如:

  1. 表单验证:在复杂表单中,深度监听可以让你实时检测表单数据的变化,并立即进行验证。
  2. 状态管理:在 Vuex 这样的状态管理库中,深度监听可以确保状态树中的任何变化都能被捕捉到,并触发相应的副作用。
  3. 数据同步:当你需要实时同步用户输入或者其他数据时,深度监听可以确保数据的一致性。

注意事项

虽然深度监听提供了强大的功能,但也有一些需要注意的地方:

  1. 性能开销:深度监听会增加一定的性能开销,尤其是当对象结构非常复杂时。因此,在不需要的情况下,尽量避免使用深度监听。
  2. 循环引用:如果对象中存在循环引用,递归实现的深度监听可能会导致无限递归。Vue 内部有机制来处理这种情况,但在手动实现时需要小心。
  3. 内存泄漏:如果一个对象不再被引用,但由于深度监听的存在,可能导致这个对象不能被垃圾回收器回收。

标签:Vue,递归,value,js,person,深度,监听
From: https://blog.51cto.com/shenlong888/12110363

相关文章

  • java+vue计算机毕设X钢材商贸公司网络购销管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和互联网经济的蓬勃兴起,传统钢材商贸行业正面临前所未有的变革与挑战。X钢材商贸公司作为业内的佼佼者,长期以来依赖传统的购销......
  • java+vue计算机毕设爱心宠物中心管理系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着现代生活节奏的加快和城市化进程的推进,宠物已成为许多家庭不可或缺的重要成员,它们不仅为人们的生活带来了欢乐与陪伴,也促进了人与动物之间的情感......
  • java+vue计算机毕设IE绿色城市垃圾分类监管系统【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着城市化进程的加速,城市生活垃圾产生量急剧增加,垃圾分类已成为缓解“垃圾围城”困境、促进资源循环利用、实现绿色可持续发展的重要举措。然而,传统......
  • vue-router 原理
    前端路由原理hashH5history1.用JS实现hash路由通过hash变化触发路由变化->触发视图更新不会触发页面刷新window.onhashchange2.使用JS实现H5history路由history.pushStatewindow.onpopstate需要后端支持两者怎么选择?......
  • react之jsx基础(2)高频使用场景
    在React中,JSX的使用是非常广泛和高频的。以下是一些常见的高频使用场景及其示例,帮助你更好地理解JSX的实际应用:1.组件定义JSX最常见的用途之一是定义组件的结构。组件可以是函数组件或类组件,通常会使用JSX来描述组件的UI。函数组件示例:functionGreeting(props){......
  • [vue] vue-seamless-scroll 滚动到第二遍的时候不能进行点击的问题
    问题:使用vue-seamless-scroll组件时,循环第一遍可以正常点击,之后不能够正常点击,触发不了点击事件.解决办法:在vue-seamless-scroll外的父元素上添加点击事件,利用js的事件委托(通俗地来讲,就是把一个元素响应事件(click、keydown…)的函数委托到另一个元素)使用(data-XXX)自定义属性可以给......
  • 【万字文档+PPT+源码】基于springboot+vue二手交易平台-可用于毕设-课程设计-练手学习
    博主简介:......
  • vue项目中——如何用echarts实现动态水球图
            有时候UI的脑洞真的很大,总是设计出一些稀奇古怪的图形,但又不得不佩服他们的审美,确实还挺好看的。今天给大家介绍echarts如何实现动态水球图。如图所示:  实现步骤一、引入在vue页面中引入echarts,如未安装需要先npm安装html:<template><divid="chart">......
  • Vue3 - 详细实现安装引入高德地图并查询展示周边交通/教育/医疗/商场/生活/娱乐等POI
    前言Vue2版本,请访问这篇文章。在vue3|nuxt3项目开发中,详解高德地图根据当前定位获取周边附近的商圈,vue3高德地图获取周边商圈并将这些地址位置列出来供用户点击跳转和选择,获取当前位置或指定区域周边的交通出行、学校教育、医院诊所、商场购物、生活娱乐、旅游景......
  • 搭建一个前后端分离的Vue框架(windows 前端篇)
    一:前言:前段时间出来一期Python Django框架的安装搭建以及数据库配置、解决跨域等相关问题都已经写在后端文章中了,本期主要是给大家出一期前端框架的搭建以及向后端发送请求,让大家更加直观的看到前后端联调的一个效果,废话少说,直接开始上手,首先我们先了解一下Vue框架,大家可以......