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

下面是关于“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项目打包部署全过程(history模式)

    下面是Vue项目打包部署全过程(history模式)的完整攻略。 1. 打包项目 使用Vue CLI的build命令来打包项目,在项目根目录下的终端输入以下命令: npm run build 这将把项目打包到dist目录中。打包完后,dist目录下会生成一个index.html文件和一些资源文件。 2. 配置服务器 使用Express框架来搭建服务器,先安装…

    Vue 2023年5月28日
    00
  • Vue Cli项目重构为Vite的方法步骤

    Vue Cli项目重构为Vite的方法步骤: 安装Vite 首先,需要通过npm或yarn来全局安装Vite。可以使用以下命令来安装: npm install -g vite 或 yarn global add vite 创建新的Vite项目 使用Vite创建新项目时,可以选择手动创建或使用预设模板。推荐使用预设模板来快速创建新项目。可用的预设模板包括Rea…

    Vue 2023年5月28日
    00
  • js基于div丝滑实现贝塞尔曲线

    下面就是详细讲解“js基于div丝滑实现贝塞尔曲线”的完整攻略。 1. 什么是贝塞尔曲线? 贝塞尔曲线是一种使用平滑曲线连接任意多个点的数学函数,并且通过更改这些点的锚点信息来改变曲线的特性。在前端网站开发中,贝塞尔曲线经常被用来创建各种交互效果,如动画、滑动、转场等。 2. 为什么要基于div实现贝塞尔曲线? 虽然在SVG和canvas中也可以实现贝塞尔曲…

    Vue 2023年5月28日
    00
  • vue多次循环操作示例

    下面是关于“vue多次循环操作示例”的完整攻略,我将分两个示例说明: 示例一:多层循环嵌套 在vue中,可以使用嵌套的v-for指令来进行多层循环嵌套。比如,我们有一个任务列表,每个任务列表下面又有多个子任务列表,现在要把这些任务列表都展示出来。可以使用以下代码实现: <div v-for="(task, index) in tasks&qu…

    Vue 2023年5月27日
    00
  • Vue.js最佳实践(五招助你成为vuejs大师)

    Vue.js最佳实践(五招助你成为vuejs大师)是一篇关于Vue.js开发实践的文章,其中详细讲述了Vue.js最佳的五项实践原则。下面我们将详细介绍这五项实践原则: 一、使用“单文件组件”和“组件懒加载”实现代码复用和性能优化 单文件组件(Single File Components,SFC)是Vue.js提倡的一种组件写法,它将一个组件的HTML、CS…

    Vue 2023年5月27日
    00
  • vue实现全选功能

    下面是详细讲解“Vue.js实现全选功能”的完整攻略,包含两条示例说明: 一、实现思路 要实现全选功能,需要以下几个步骤: 定义一个变量来存储当前是否为全选状态。 绑定checkbox的v-model,将每个checkbox的选中状态绑定到一个数组中。 使用计算属性,判断当前是否处于全选状态,然后绑定全选的checkbox的v-model,实现全选功能。 监…

    Vue 2023年5月29日
    00
  • 解决vue props传Array/Object类型值,子组件报错的情况

    解决 Vue props 传 Array/Object 类型值,子组件报错的情况,可以通过以下几种方式来实现,具体步骤如下: 使用具体类型声明 Props 在声明组件的 props 时,可以使用具体类型来声明,例如: props: { data: Array // 声明 Array 类型的 data Prop } 这样可以确保子组件在接收到 props 时,…

    Vue 2023年5月29日
    00
  • el-date-picker日期范围限制的实现

    下面我来详细讲解“el-date-picker日期范围限制的实现”的完整攻略。 创建日期范围限制的实现 在实现日期范围限制之前,需要使用 Element UI 中的 el-date-picker 组件来创建日期选择器。el-date-picker 组件可通过 picker-options 属性来设置自定义的配置项,从而实现日期范围限制。 <templa…

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