Vue 一步之遥
标签
开发/前端/Vue
字数
512 字
阅读时间
3 分钟
How to be well-versed in Vue?
从普遍意义上来说,Vue 在现在应该指代 Vue3
I have NO IDEA about this question.
We should know WHY it happened rather than just know WHAT happened.
响应式系统 Reactive System
"Vue 最标志性的功能就是其低侵入性的响应式系统。组件状态都是由响应式的 JavaScript 对象组成的。当更改它们时,视图会随即自动更新。这让状态管理更加简单直观,但理解它是如何工作的也是很重要的,这可以帮助我们避免一些常见的陷阱。"
From Vue Doc.
简单地来说,响应式就是 要响应 在更新的时候同步更新关联的状态
Reactive 和 Ref
ref()
ref() 实际上是构建 RefImpl 的一个工厂函数,而RefImpl是
TypeScript
/* 简化版RefImpl源码 */
import { trackRefValue, triggerRefValue } from './effect'
import { toReactive } from './reactive'
// 一个标志,用来判断一个对象是不是 ref
export const isRef = (r: any): r is Ref => !!(r && r.__v_isRef === true)
// RefImpl
export class RefImpl<T> {
private _value: T
private _rawValue: T
// 这是 isRef() 函数检查的标志
public readonly __v_isRef = true
constructor(value: T) {
// _rawValue 存储原始值,用于 set 时的比较
this._rawValue = value
// _value 存储的是响应式的值。如果传入的是对象,会被 toReactive 包装
this._value = toReactive(value)
}
// .value 属性的 getter
get value() {
// 关键步骤1:依赖收集
// trackRefValue 会将当前激活的副作用(effect)与这个 ref 实例关联起来
trackRefValue(this)
return this._value
}
// .value 属性的 setter
set value(newVal) {
// 如果新值和原始旧值没有变化,则什么都不做
if (Object.is(newVal, this._rawValue)) {
return
}
// 更新原始值和响应式的值
this._rawValue = newVal
this._value = toReactive(newVal)
// 关键步骤2:触发更新
// triggerRefValue 会找到所有依赖这个 ref 的副作用,并让它们重新执行
triggerRefValue(this)
}
}
// ref() 函数就是创建 RefImpl 实例的工厂函数
export function ref(value?: unknown) {
return new RefImpl(value)
}
Kiracoon