Vue.js - 如何正确观察嵌套属性

在使用 Vue.js 进行开发时,我们经常需要对组件的数据进行观察和调试。Vue 提供了 watchcomputed 两种方式来实现数据的监控,但是当数据有多层嵌套时,如何正确观察嵌套属性呢?

问题描述

假设我们有一个嵌套的数据结构:

------ -
  ------ -
    ----- -
      ----- -----
      ---- ---
      -------- -
        --------- -----
        ----- -----
      --
    --
  --
--

如果我们需要监控 address.province 的变化,一般会写出如下代码:

------ -
  ------------------------ -------- ---------- --------- -
    --------------------- ------- ------ --------- ----- ----------
  --
--

然而,这样的代码并不能起到我们想要的效果!因为在 Vue 中,只有顶层的属性才会被 Vue 实例的响应式系统所追踪,底层的属性并不会被追踪。当我们修改 address.province 时,并不会触发 watch

那么,如何正确观察嵌套属性呢?

解决方案

Vue 提供了一个 $set() 方法,可以将一个对象或数组设置为响应式的。使用 $set() 方法后,即使是嵌套属性,也会被 Vue 实例的响应式系统所追踪。

---------------------------- ----------- ------

然而,如果数据层级很深,每次都手动调用 $set() 方法就显得非常麻烦。更好的解决方案是使用 Vue.set()this.$set() 的别名:

------ --- ---- ------

-------------------------- ----------- ------
-- --
---------------------------- ----------- ------

这样,当我们修改 address.province 时,就能正确触发 watch

示例代码

下面是一个完整的示例代码:

----------
  ------- --------------------- --------
-----------

--------
------ --- ---- ------

------ ------- -
  ------ -
    ------ -
      ----- -
        ----- -----
        ---- ---
        -------- -
          --------- -----
          ----- -----
        --
      --
    --
  --
  ------ -
    ------------------------ -------- ---------- --------- -
      --------------------- ------- ------ --------- ----- ----------
    --
  --
  --------- -
    -- ---------- -----
    -------------------------- - -----
    
    -- -------- ---------
    -------------------------- ----------- ------
    -- ---- -----------
    ---------------------------- ----------- ------
  --
--
---------

总结

在 Vue.js 中,当我们需要观察嵌套属性时,需要将嵌套属性设置为响应式的。可以使用 $set()Vue.set() 方法来实现。这样,即使是嵌套属性,也能被 Vue 实例的响应式系统所追踪,从而正确触发 watchcomputed

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/13402


猜你喜欢

  • 在 Backbone.js 中处理视图和模型对象

    Backbone.js 是一个流行的开源 JavaScript 库,用于构建单页应用程序。它提供了一种组织代码的方式,使前端开发更加简单和高效。 在 Backbone.js 中,视图和模型对象是两个核...

    7 年前
  • 在各种浏览器中用 JavaScript 读取客户端上的文件内容

    在开发 Web 应用程序时,经常需要从客户端读取文件内容。不同浏览器有不同的方式来处理文件读取,但是使用 JavaScript 代码可以实现跨浏览器的解决方案。 FileReader API File...

    7 年前
  • 谷歌图/表重绘窗口大小调整

    在前端开发中,图表是一个常见的组件。而随着用户使用不同设备访问网站,图表可能需要在不同的窗口大小下进行重绘。本文将介绍如何在 Google Charts 图表中实现窗口大小调整时的重绘,并提供示例代码...

    7 年前
  • 调试消息“资源解释为其他,但与MIME类型的应用程序/ JavaScript转移”

    前端开发中经常会遇到各种调试错误,其中一种常见的错误是资源解释为其他,但与 MIME 类型的应用程序/JavaScript 转移。本文将详细介绍这个错误的原因、解决方法以及对前端开发的指导意义。

    7 年前
  • 从 Excel 复制到网页:一种前端技术实现方法

    在前端开发中,经常会有需要将 Excel 中的数据导入到网页中的需求。本文介绍一种实现方法,详细说明了数据处理的流程和相关技术。 实现步骤 将 Excel 文件转换为 CSV 格式。

    7 年前
  • 对fs.createReadStream VS fs.readFile Node.js的利弊

    在 Node.js 中,fs 模块是一个用于文件系统操作的核心模块。其中有两个常用的方法:fs.createReadStream 和 fs.readFile。这两个方法可以用来读取文件的内容,但它们之...

    7 年前
  • 如何构造我的JavaScript/jQuery代码?

    在前端开发中,JavaScript和jQuery都是必不可少的语言和库。它们可以使我们的网站更加交互性和动态化。但是,编写高质量的JavaScript和jQuery代码并不是一件容易的事情。

    7 年前
  • 当使用电子(原子壳层)时,客户机/服务器模型是什么?

    在前端开发中,我们常常需要通过客户端和服务器之间的通信来获取、处理和展示数据。当使用电子(原子壳层)这一技术时,客户机/服务器模型的实现方式也有所不同。 客户机/服务器模型简介 客户机/服务器模型是指...

    7 年前
  • 让 RequireJS 与 Jasmine 合作

    在前端开发中,我们经常需要使用模块化来组织代码、提高可维护性。RequireJS 是一个流行的 JavaScript 模块加载器,它能够使得代码更加模块化、可扩展和可重用。

    7 年前
  • JavaScript本地和全局变量混淆

    在 JavaScript 中,变量的作用域分为本地(函数内部)和全局(整个脚本)。当函数中声明与全局变量相同名称的变量时,就会出现变量混淆问题。 问题描述 考虑以下示例代码: --- ---- - -...

    7 年前
  • 在选项卡索引中集中下一个元素

    在前端开发过程中,我们经常会使用选项卡来展示不同的内容。然而,在用户使用选项卡时,如果没有良好的交互设计和体验,就容易出现问题。其中一个问题是当用户想要查看当前选项卡之后的内容时,他们必须一个一个地点...

    7 年前
  • 如何在 JavaScript 中获取全局对象?

    JavaScript 是一门面向对象的编程语言,全局对象是其最顶层的对象。它是一个包含了所有 JavaScript 内置函数和变量的对象,在前端开发中扮演着非常重要的角色。

    7 年前
  • 哪里是控制台API的 WebKit/旅行了吗?

    在前端开发中,控制台是一个非常重要的工具。它可以帮助我们快速地调试和定位问题。而控制台中的API也是非常强大的,包括标准的console对象、Network、DOM等等。

    7 年前
  • jQuery document.ready VS PhoneGap deviceready

    在前端开发中,我们常常需要等待DOM加载完毕或者设备准备就绪后再执行相应的操作。而jQuery的document.ready事件和PhoneGap的deviceready事件则是两种常见的等待机制。

    7 年前
  • 调用/点击 jQuery JavaScript mailto 链接

    在前端开发中,我们常常需要让用户可以发送邮件。使用 mailto 链接是一种简单而有效的方式。本文将向你介绍如何使用 jQuery 和 JavaScript 创建一个 mailto 链接,并通过点击链...

    7 年前
  • 在THREE.js中使用纹理

    THREE.js是一个广泛使用的WebGL库,它允许您创建各种3D场景和交互式内容。其中一个关键方面是能够在对象表面上放置图像纹理。 纹理基础知识 纹理是2D图片,被应用到3D模型表面,以增强渲染效果...

    7 年前
  • Chrome JavaScript调试——如何在页面刷新或通过代码中断之间保存断点?

    作为前端开发人员,我们经常需要调试JavaScript代码以解决问题。Chrome浏览器提供了强大的开发工具来帮助我们进行调试。其中一个功能是断点调试,它允许我们在特定行上中断代码执行并检查变量的值。

    7 年前
  • 等待一个具有动画的函数完成,直到运行另一个函数为止

    在前端开发中,我们经常需要等待一个具有动画效果的函数完成后再执行另一个函数。这通常涉及到异步编程和回调函数等概念,需要一定的前端技术知识才能完成。在本文中,我们将详细讲解如何实现这个过程,并提供示例代...

    7 年前
  • 如何在JavaScript中用ASCII值创建字符串或char?

    在JavaScript中,可以通过ASCII码表来创建字符串或单个字符。ASCII码是将数字与字符相互映射的编码系统。每个字符都有一个唯一的ASCII值,在0到127之间。

    7 年前
  • 用函数代替 lodash 来进行匹配

    在前端开发中,我们经常需要对数组或对象进行筛选、查找等操作。很多开发者习惯于使用 Lodash 的函数库来完成这些任务,因为 Lodash 提供了许多强大而方便的工具函数。

    7 年前

相关推荐

    暂无文章