我对computed的理解-以及computed的传参

简介: 我对computed的理解-以及computed的传参

computed 传参

<template>
  <div>
    <p>computed传参的写法:{{ who1Params('--我是传参的内容') }}</p>
  </div>
</template>
<script>
export default {
  name: 'App',
  data() {
    return {
      firstName: '张先生',
    }
  },
  computed: {
    who1Params() {
      return function (Ba) { 
        console.log('输出的内容是:', Ba) //输出的内容是:
        return this.firstName + Ba
      }
    },
  }
}
</script>

我对computed源码的理解

初始化 computed的时候会调用 initComputed 函数。
然后注册一个 watcher 实例,实例化一个 Dep 消息订阅器,用作后续收集依赖。
调用计算属性时会触发Object.defineProperty的get(访问器)函数。
调用 depend 方法向自身的消息订阅器 dep的subs 中添加watcher。
当某个属性发生变化,触发 set 函数。
然后调用自身的消息订阅器 dep 的 notify 方法。
遍历当前 dep 中保存着所有订阅者(wathcer) 的 subs 数组。
并逐个调用 watcher 的  update 方法,完成响应更新。

我们观察 Watcher 和 Dep 的关系

watcher 中实例化了 dep 并向 dep.subs 中添加了订阅者.
dep 通过 notify 遍历了 dep.subs 通知每个 watcher 更新

Vue 响应系统其核心有三点:observe、watcher、dep

observe:遍历 data 中的属性,使用 Object.defineProperty 的 get/set 方法对其进行数据劫持;
dep:每个属性拥有自己的消息订阅器 dep,用于存放所有订阅了该属性的观察者对象;
watcher:观察者(对象),通过 dep 实现对响应属性的监听,监听到结果后,主动触发自己的回调进行响应。

computed 和 watch 的差异:

从使用场景上说,computed 适用一个数据被多个数据影响,
而 watch 适用一个数据影响多个数据;

computed 的注意点

computed计算属性是基于它们的响应式依赖进行缓存的。
只在相关响应式依赖发生改变时它们才会重新求值。
注意:如果某个依赖 (比如非响应式属性) 在该实例范畴之外,
则计算属性是不会被更新的。

遇见问题,这是你成长的机会,如果你能够解决,这就是收获。

相关文章
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
1947 0
|
存储 安全 BI
图文详解丨iOS App上架全流程及审核避坑指南
图文详解丨iOS App上架全流程及审核避坑指南
5075 0
图文详解丨iOS App上架全流程及审核避坑指南
|
小程序 计算机视觉
UNIAPP微信小程序使用Echarts
UNIAPP微信小程序使用Echarts
3378 0
|
缓存 JavaScript 前端开发
vue中使用keep-alive的问题
vue中使用keep-alive的问题
412 59
|
缓存 安全 前端开发
Electron on macOS: 揭秘 MacUpdater 如何实现无缝自动更新?
本文首发于微信公众号“前端徐徐”,详细探讨了 Electron 应用在 macOS 平台上的更新原理。文章分析了 `MacUpdater` 类的实现,包括与 Electron 原生更新器的集成、更新检测和下载、代理服务器管理、环境适配、安全性保障、错误处理和日志记录、更新安装流程控制以及缓存管理等关键功能。通过这些技术细节,展示了如何在 macOS 上实现高效、安全的 Electron 应用更新。
459 0
Electron on macOS: 揭秘 MacUpdater 如何实现无缝自动更新?
|
JavaScript
Vue2图片懒加载(vue-lazyload)
这篇文章介绍了如何在Vue 2项目中使用`vue-lazyload`插件来实现图片的懒加载功能,包括安装插件、注册配置以及在页面中的具体使用方法。
592 0
Vue2图片懒加载(vue-lazyload)
|
存储 对象存储
【阿里云OSS】You have no right to access this object because of bucket acl.
【阿里云OSS】You have no right to access this object because of bucket acl.
18444 1
【阿里云OSS】You have no right to access this object because of bucket acl.
|
JavaScript API
vue3父子组件相互调用方法详解
vue3父子组件相互调用方法详解
设置WebStorm查看本地源码文件个人修改的历史记录快捷键Alt+Shift+H、Ctrl+Shift+H(通常用于调试bug,发现文件出问题需要回溯到若干天之前)
设置WebStorm查看本地源码文件个人修改的历史记录快捷键Alt+Shift+H、Ctrl+Shift+H(通常用于调试bug,发现文件出问题需要回溯到若干天之前)
|
前端开发 微服务
VSCode 警告:v-on event ‘@toggleClick‘ must be hyphenated
VSCode 警告:v-on event ‘@toggleClick‘ must be hyphenated