vue源码解析computed多次访问会有死循环原理

yizhihongxing

下面是关于“vue源码解析computed多次访问会有死循环原理”的完整攻略。

1. computed的原理

先来简单介绍一下computed的原理。在Vue组件中,computed是指计算属性,是一个基于响应式依赖进行缓存的数据属性,它的值在使用时会自动收集依赖,发现依赖变化时会重新计算,并且将结果缓存起来,直到依赖变化才重新计算。这样就避免了重复计算,提升渲染性能。computed的实现依赖于Vue内部的Watcher类。

2. 访问computed多次时可能出现的问题

由于computed的计算是基于依赖收集,因此在我们多次访问computed属性时,可能会导致依赖重复收集的问题,这会导致计算属性的getter方法被执行多次,进而引发死循环。下面通过代码示例进一步说明这个问题。

<!-- template -->
<template>
  <div>{{ message }}</div>
</template>
// script
export default {
  data() {
    return {
      count: 0,
    }
  },
  computed: {
    message() {
      const count = this.count++
      console.log(`count: ${count}`)
      return `当前计数为 ${count}`
    },
  },
}

上面的代码中,message()方法用于计算一个字符串,内部会打印出计数器的值,并将其返回在字符串中。我们将这个字符串插入到模板中,这样每次模板更新时就会访问message()方法。我们可以通过多次访问message()来测试computed的计算过程。

// 在其他地方使用,比如mounted或者created钩子函数
console.log(this.message) // 输出 "当前计数为 0"
console.log(this.message) // 输出 "当前计数为 1"
console.log(this.message) // 输出 "当前计数为 2"

我们可以从控制台输出看到,每次调用message()方法时都会打印计数器的值。这是由于多次访问计算属性会引发计算属性本身的getter方法被多次触发。

3. 解决computed多次访问死循环的问题

为了避免多次访问computed时的死循环问题,Vue的computed实现中采用了缓存的方式,只要计算属性的依赖没有发生改变,就会直接返回缓存的值,而不是重新计算。这个缓存是通过Watcher类实现的。

完整源码的解析过程这里暂且不细讲(可以参考一些源码解析的文章),通过对computed的简单分析,我们可以得出以下几点结论:

  • computed的实现依赖于Vue内部的Watcher类,每个computed属性都会被创建一个watcher实例
  • 每个watcher实例都有一个缓存变量,用于存储computed属性的值
  • 计算computed属性时,会将计算过程中涉及到的依赖收集起来,如果依赖发生变化,就会重新计算值,否则直接返回缓存的值
  • 对于一个指定的watcher实例,每次执行它的get方法时,会先将当前watcher实例设置为Dep.target,然后再访问计算属性的值,在计算属性计算的过程中,所有访问的响应式数据都会被添加到当前watcher实例的依赖中(核心:响应式数据发生变化后会触发Watcher实例的update方法,这个方法中会将缓存值失效并重新计算),最后将当前watcher置为空。

以上是对一些computed的基本原理和实现细节的解释,相信通过这个简单的分析,你已经对computed的工作原理有了一些了解。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue源码解析computed多次访问会有死循环原理 - Python技术站

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

相关文章

  • Vue组件间通信方式全面汇总介绍

    下面我将详细讲解“Vue组件间通信方式全面汇总介绍”的完整攻略。 1. 前言 在Vue的开发中,组件间通信是很常见的需求。要想做好组件间通信,我们必须要掌握不同的组件通信方式。本篇文章将全面汇总介绍Vue组件间通信的方式,希望能够对Vue的学习者有所帮助。 2. 父子组件通信 2.1 父传子 父组件向子组件通信,可以通过props属性来传递。具体实现方法如下…

    Vue 2023年5月29日
    00
  • 基于cornerstone.js的dicom医学影像查看浏览功能

    下面我将为大家分享基于cornerstone.js的dicom医学影像查看浏览功能的完整攻略: 简介 DICOM(Digital Imaging and Communications in Medicine)是医学影像和相关信息的国际标准,它定义了医学影像的格式、传输协议以及元数据等信息,被广泛应用于医学领域。在web应用中,通常需要通过浏览器对DICOM医…

    Vue 2023年5月28日
    00
  • vue中的生命周期及钩子函数

    Vue 是一款流行的前端框架,它的设计理念是数据驱动视图。在 Vue 中,每个组件都有一组生命周期钩子函数。钩子函数是指在组件的某个时刻会被调用的函数。Vue 的生命周期分为四个阶段:创建、挂载、更新和销毁阶段。 创建阶段的生命周期钩子函数 在创建阶段,Vue 将会创建组件的实例,并先后调用以下生命周期钩子函数: beforeCreate 在实例被创建之前,…

    Vue 2023年5月27日
    00
  • 在Vue项目中使用snapshot测试的具体使用

    在Vue项目中使用snapshot测试是一个非常好用的工具,可以有效测试组件的渲染结果,也方便我们方便我们查看代码变化和错误信息。以下是具体的使用攻略: 安装依赖 Vue项目中使用snapshot测试需要安装vue-test-utils和jest的相关依赖。可以使用npm或yarn进行安装。 npm install –save-dev @vue/test-…

    Vue 2023年5月27日
    00
  • Vue Object.defineProperty及ProxyVue实现双向数据绑定

    Vue是一款流行的JavaScript框架,它拥有与DOM相关的数据绑定能力。其中,双向数据绑定是Vue框架中最为重要的概念之一。 在Vue中,我们可以通过使用Object.defineProperty()或Proxy方法实现双向数据绑定。这两种方法的实现方式其实很类似,它们都可以通过监听数据变化来实现数据的双向绑定。 Object.defineProper…

    Vue 2023年5月28日
    00
  • Vue如何实现变量表达式选择器

    Vue中实现变量表达式选择器,需要使用Vue的计算属性computed以及Vue的模板语法。下面是完整的攻略,包括两个示例说明: 步骤一:定义计算属性 在Vue组件中,我们可以使用计算属性computed来定义一个具有getter函数的属性。该getter函数可以根据组件的数据data以及其他Vue实例的数据来计算出该计算属性的值。因此,我们可以使用计算属性…

    Vue 2023年5月27日
    00
  • Vue3 computed初始化获取设置值实现示例

    首先,让我们了解Vue3中computed的使用方式。 在Vue3中,computed不再是选项,它变成了函数。 计算属性的本质仍然是基于依赖项进行缓存的值,但现在您必须显式地自定义getter和setter函数。 创建Computed属性 要创建计算属性,请将一个函数传递给computed()函数。该函数被定义为getter函数,在计算属性的依赖项发生更改…

    Vue 2023年5月28日
    00
  • 一文学会什么是vue.nextTick()

    一文学会什么是vue.nextTick() 什么是vue.nextTick() vue.nextTick()是Vue.js的一个方法,它的作用是在修改数据之后等待DOM更新完毕后执行回调函数。在有些情况下,当我们修改了某个数据后需要对DOM进行操作(比如获取某个元素的高度),此时DOM可能还没有更新完毕,这就需要加入一个异步任务,等待DOM更新完毕后再执行相…

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