面试题答案
一键面试数据结构
- Reactive Signal:Solid.js 中最基本的响应式数据单元。它是一个函数,调用时返回当前值,并且通过
createSignal
等方法创建。例如:
import { createSignal } from 'solid-js';
const [count, setCount] = createSignal(0);
这里 count
是获取当前值的函数,setCount
是更新值的函数。
-
Effect:代表一个副作用函数,它依赖于响应式信号。当所依赖的信号值发生变化时,副作用函数会自动重新执行。例如
createEffect
创建的函数。 -
Computed Signal:通过
createComputed
创建,它是基于其他响应式信号的派生值。计算信号缓存其值,只有当依赖的信号变化时才会重新计算。
主要操作步骤
- 信号创建:使用
createSignal
创建响应式信号,内部维护一个当前值和依赖它的副作用函数列表(effect 列表)。例如:
const [name, setName] = createSignal('John');
- Effect 创建:当使用
createEffect
创建副作用函数时,Solid.js 会自动追踪该副作用函数中所依赖的信号。例如:
import { createSignal, createEffect } from'solid-js';
const [count, setCount] = createSignal(0);
createEffect(() => {
console.log('Count is:', count());
});
在这个 createEffect
中,它依赖了 count
信号。Solid.js 会将这个副作用函数添加到 count
信号的依赖列表中。
-
依赖追踪:在副作用函数执行期间,每当访问一个信号(如
count()
),Solid.js 就会记录该副作用函数对这个信号的依赖关系。具体实现中,可能会使用栈来管理当前正在执行的副作用函数,以便准确记录依赖。 -
信号更新:当信号值通过更新函数(如
setCount
)改变时,Solid.js 会遍历该信号的依赖列表(effect 列表),并标记这些副作用函数为需要重新执行。然后,在适当的时机(通常是当前栈清空,事件循环的下一个 tick),重新执行这些副作用函数,从而实现响应式更新。 -
计算信号:对于计算信号,当依赖的信号发生变化时,计算信号会重新计算其值,并更新依赖它的副作用函数。计算信号的计算逻辑只在其依赖信号变化时执行,并且会缓存计算结果,提高性能。例如:
import { createSignal, createComputed } from'solid-js';
const [a, setA] = createSignal(1);
const [b, setB] = createSignal(2);
const sum = createComputed(() => a() + b());
createEffect(() => {
console.log('Sum is:', sum());
});
这里 sum
是基于 a
和 b
的计算信号,当 a
或 b
变化时,sum
会重新计算,并触发依赖它的副作用函数重新执行。