Skip to content
vue
<script setup lang="ts">
import { ref, computed } from 'vue';

const a = ref(0);
const b = ref(0);
const sum = computed(() => a.value + b.value);
</script>

<template>
    <div><input v-model.number="a" type="number" /> + <input v-model.number="b" type="number" /> = {{ sum }}</div>
</template>
ts
// src/index.ts (简化示意)
function computed<T>(getter: (previousValue?: T) => T): () => T {
    // 1. 创建计算属性对象
    const computedObject: Computed<T> = {
        currentValue: undefined, // 初始无缓存值
        subs: undefined, // 初始没有订阅者依赖它
        subsTail: undefined,
        deps: undefined, // 初始不知道依赖谁
        depsTail: undefined,
        flags: SubscriberFlags.Computed | SubscriberFlags.Dirty, // 标记为 Computed 和 Dirty
        getter: getter // 存储计算逻辑
    };

    // 2. 返回绑定了计算属性对象的 getter 函数
    return computedGetter.bind(computedObject) as () => T;
}