手写Promise及其相关方法
# 手写 promise # 完整代码 const PENDING = Symbol('pending');const FULFILL = Symbol('resolve');const REJECT = Symbol('reject');class myPromise { constructor(executor) { /* 初始化 promise pending 状态 */ this.status = PENDING; /* 记录当前 promise 兑现值和拒因 */ this.value =...
more...理解事件循环
# 浏览器中的事件循环 # 同步与异步 浏览器是单线程的,所以为了不堵塞代码的运行,我们将任务分为了同步任务,和异步任务( setTimeout 和 setInterval 、 axios 、事件绑定等这种带回调函数的),那么同步任务和异步任务又是按照怎样的顺序进入主线程执行的呢,废话不多说,直接上图好叭 😎 先看一段代码,我们会结合这张图和代码来先简单认识一下同步和异步的执行 执行的结果很简单 start -> end -> 时间到了 整个 script 代码进入主线程,遇到同步任务 start 的打印,执行打印 遇到异步任务 setTimeout ,将...
more...Vue响应式模块-reactivity-effect
# effect 方法剖析与实现 # 完整代码 export type EffectFn = { (): any; deps: Array<Set<EffectFn>>; options?: Options;};type Options = { scheduler?: (fn: EffectFn) => void; lazy?: boolean;};let activeEffect: EffectFn;const effectStarck:...
more...Vue响应式模块-reactivity-computed
# 文档描述 接受一个 getter 函数,返回一个只读的响应式 ref 对象。该 ref 通过 .value 暴露 getter 函数的返回值。它也可以接受一个带有 get 和 set 函数的对象来创建一个可写的 ref 对象。 具有缓存机制,只有当依赖的响应式数据发生改变的时候才会重新计算,否则会直接读取缓存的值 # 实现思路 computed 返回的是一个 ref ,所以我们需要一个类来进行 get value , set value 的操作 当依赖的响应式数据发生改变时会重新计算,所以需要引入 effect 函数来注册依赖副作用,并进行依赖的收集和触发操作,收集的依赖就是...
more...Vue响应式模块-reactivity-ref
# 文档介绍 接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 # 实现原理 因为返回的是一个 ref 对象,所以需要一个 RefImpl 类,在类里面进行 get value 和 set value 操作 get value 里进行依赖的收集, set value 里进行依赖的触发 # 完整代码 import { hasChanged, isObject } from '../utils/index';import { track, trigger...
more...Vue响应式模块-reactivity-watch(watchEffect)
# 文档描述 侦听一个或多个响应式数据源,并在数据源变化时调用所给的回调函数。 watch () 默认是懒侦听的,即仅在侦听源发生变化时才执行回调函数。 watch 的第一个参数可以是不同形式的 “数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组: # 实现思路 因为监听的响应式对象 or getter 函数返回的响应式数据发生改变的时候,就要执行回调函数 callback ,所以需要引入 effect 函数来进行副作用函数依赖的注册,收集,触发,收集的依赖也就是 getter 函数 当监听的对象 or getter...
more...Vue运行时模块-runtime-patchKeyChildren
# 简单介绍 vue3 中对带有 key 的子节点是利用快速 diff 算法进行更新的 # 快速 diff 算法基本原理 首先进行预处理,设置一个指向数组头部的指针 j ,再通过新旧数组的长度 - 1 来获取指向新旧数组尾部的指针 newEndIndex , oldEndIndex 。 判断新旧头节点,新旧尾节点的 key 是否相同,相同则调用 patch 函数进行,并将指向头节点的指针 j 向下移动,指向尾节点的指针 newEndIndex , oldEndIndex 向上移动,以此循环,直到遇到 key...
more...




