Vue 如何追踪数据变化

Vue 是一个数据驱动的MVVM框架,其数据变化追踪机制可以让开发者非常方便地进行可靠的开发。Vue 如何追踪数据变化呢?下面是一些关于 Vue 数据变化追踪机制的详细描述。

1. 响应式数据

Vue 中的数据变化追踪是通过"响应式数据"这一概念实现的。所谓"响应式数据",就是在Vue的实例化过程中,通过对数据进行代理实现当数据发生变化时,及时通知修改监听器。

比如,我们有以下代码:

let data = {
    name: "Tom",
    age: 18
}

我们通过一个 Vue 实例进行实例化(假设实例化过程正确):

var vm = new Vue({
    data: data
})

在这个过程中,Vue 内部会对 data 的每一个属性进行代理,也就是在 Vue 实例对象 vm 上定义与 data 一致的属性'name'和'age',并且将这些属性设置成可观测的(observable)。这样一来,当我们修改 data 中的'name'或'age'时,Vue 内部会监听这些修改并进而“服务好”我们的应用程序。例如:

// 通过vm来修改数据
vm.name = "lucy";
vm.age = 20;

Vue 内部就会及时发出通知,通知相关的组件或者指令进行更新操作。

2. 响应式数据和依赖收集

Vue 在响应式数据背后,使用了一种称之为“依赖收集”的机制。当我们访问一个 Vue 的响应式属性时,Vue 内部的“依赖收集”机制会记住这个“依赖”(也就是属性所在的 Watcher)。比如下面的代码:

<template>
  <div>
    <p>{{ message }}</p>
    <p>{{ computedMessage }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello, Vue!',
    };
  },

  computed: {
    computedMessage() {
      return this.message.toUpperCase();
    },
  },
};
</script>

当 Vue 实例首次挂载时,Vue 会对每个响应式数据(这里是 message 属性)进行依赖收集。当 message 属性发生改变时,Vue 会通知之前收集的 Watcher(在这里是 computedMessage 中使用的 Watcher),进而更新这个 Watcher 所在的组件的视图。

示例说明:

示例一:基本使用

对于一个 Vue 实例,我们可以使用 $watch API 来监听一个响应式属性的变化。Vue 会在内部将它变成一个 Watcher 对象,并且把它添加到 Watcher 列表中。

如下所示:

<template>
  <div>
    <span>{{ count }}</span>
  </div>
</template>

<script>
export default {
  data: {
    return {
      count: 0,
    };
  },

  created() {
    this.$watch('count', (newValue, oldValue) => {
        console.log(`count值变化了,新的值为:${newValue},旧的值为:${oldValue}`);
    });
  },
};
</script>

在这个示例中,我们在 Vue 实例创建并初始化之后,使用 $watch()API 监听 count 属性。当 count 发生变化时,我们将在控制台中看到该输出函数的执行结果。

示例二:computed 计算属性

computed 是用于计算基于依赖关系的响应式属性的语法糖。当一个 computed 属性被定义时,Vue 会自动为其创建一个 Watcher,并且将其加入到依赖列表中。

如下所示:

<template>
  <div>
    <input v-model = "price">
    <span>{{ total }}</span>
  </div>
</template>

<script>
export default {
  data: {
    return {
      price: 0,
      quantity: 0,
    };
  },

  computed: {
    total() {
      return this.price * this.quantity;
    },
  },
};
</script>

在这个示例中,我们使用 computed 属性来计算 total 的值。它会动态地响应 pricequantity 的变化,并自动重新计算并更新。

这是因为,依赖 pricequantity 的 Watcher 在 mounted 生命周期钩子时已经被创建并加入到了依赖列表中,在这里,当 pricequantity 的值发生变化时,它们会通知 total 的 Watcher,从而引发 total 的重新计算。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue 如何追踪数据变化 - Python技术站

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

相关文章

  • vue中过滤器filter的讲解

    Vue中过滤器Filter的讲解 Vue中的 Filter 可以用来格式化输出内容,例如格式化日期、货币、大小写等。 Filter 本质上就是一个方法,它接收一个输入值,经过处理后返回一个输出值。以下是 Filter 的基本使用方法和示例说明。 基本使用方法 在 Vue 组件选项中声明 filters 对象,可以包含多个自定义 Filter 函数。示例: V…

    Vue 2023年5月27日
    00
  • vue实现动态路由详细

    下面是关于“Vue实现动态路由详细”的完整攻略: 简介 Vue.js 是一套构建用户界面的渐进式框架,而动态路由是其中的一个非常实用的功能,它可以根据不同的参数动态的切换视图,从而达到更好的用户体验。 实现步骤 实现动态路由主要包括以下几个步骤: 配置路由参数 根据路由参数渲染页面 动态设置路由 配置路由参数 Vue 实现动态路由的第一步是配置路由参数,我们…

    Vue 2023年5月29日
    00
  • Vue路由传参的三种方式实例详解

    当我们使用Vue框架进行开发时,Vue路由传参是一项非常常见的操作,可以通过多种方式进行实现。本篇攻略将为大家介绍Vue路由传参的三种具体实例,帮助开发者更好地了解和掌握Vue路由传参的使用方法。 路径参数 路径参数是一种常见的路由传参方式,它可以将参数添加到URL的路径中,如下: const router = new VueRouter({ routes:…

    Vue 2023年5月28日
    00
  • vue webpack打包原理解析(全网最新最全)

    Vue Webpack打包原理解析 Webpack是一款优秀的模块化打包工具,它能够实现多种资源打包,并且能够和其他工具如babel等协作使用。Vue项目中也经常使用Webpack进行打包工作,下面我们来详细讲解Vue Webpack打包原理。 Webpack流程解析 Webpack的工作流程可以简单概括为:读取模块 -> 分析依赖 -> 编译打…

    Vue 2023年5月28日
    00
  • TDesign在vitest的实践示例详解

    TDesign在vitest的实践示例详解 简介 TDesign是一种基于消息传递的测试方法,能够快速而准确地发现系统中的错误和缺陷。本文将结合vitest实践,详细讲解如何使用TDesign进行测试,包括两条实例说明。 TDesign测试过程 步骤1:分析系统 在进行TDesign测试之前,需要对系统进行分析,了解其功能模块、交互方式和可能存在的问题。针对…

    Vue 2023年5月28日
    00
  • 解决router.beforeEach()动态加载路由出现死循环问题

    当使用 Vue Router 动态加载路由时,可能会遇到一个循环加载的问题,具体表现为 beforeach 全部被拦截,因此会出现死循环。这个问题的根本原因是路由对象在创建并注册路由前会被复制,因此在路由注册前执行一个 beforeEach 全局钩子,将会陷入死循环。为了解决这个问题,我们可以采用以下方案: 步骤 步骤一 在路由配置文件中为动态路由添加一个命…

    Vue 2023年5月28日
    00
  • vue el-date-picker动态限制时间范围案例详解

    针对这个主题,我将会给出完整的攻略,包含以下内容: 背景介绍 准备工作 解决方案说明 编码实现 示例说明 总结 背景介绍 在日常开发中,经常会遇到需要限制用户选择日期时间的情况,特别是时间范围的限制。vue el-date-picker是一个常用的日期时间选择器,本文将重点介绍如何使用该插件动态限制时间范围。 准备工作 在开始编写代码之前,需要先安装vue、…

    Vue 2023年5月28日
    00
  • 解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题

    在使用 mpvue + vuex 开发微信小程序时,可能会遇到 vuex 辅助函数 mapState、mapGetters 不可用的问题。这是因为 mpvue 框架在编译时将 store 对象注入到每个组件的 data 属性中,而在 wxs 中无法访问 data 中的对象,因此会导致 mapState、mapGetters 函数无法正常使用。 要解决这个问题…

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