面试题答案
一键面试使用 createEffect
处理依赖多个响应式状态变量的副作用
在Solid.js项目中,若副作用操作(如网络请求)依赖多个响应式状态变量,可按如下方式使用 createEffect
:
import { createSignal, createEffect } from 'solid-js';
// 创建响应式状态变量
const [count, setCount] = createSignal(0);
const [name, setName] = createSignal('');
createEffect(() => {
// 这里的副作用操作依赖 count 和 name
const currentCount = count();
const currentName = name();
// 发起网络请求或其他副作用操作
console.log(`Count: ${currentCount}, Name: ${currentName}`);
// 示例网络请求
// fetch(`api/endpoint?count=${currentCount}&name=${currentName}`)
// .then(response => response.json())
// .then(data => console.log(data));
});
// 改变状态,触发副作用
setCount(count() + 1);
setName('new name');
Solid.js 的依赖跟踪与避免不必要重复执行机制
Solid.js 通过跟踪副作用函数中读取的响应式状态变量来进行依赖跟踪。当 createEffect
首次运行时,Solid.js 会记录该副作用函数中访问的所有响应式状态变量。
- 跟踪过程:
- 当响应式状态变量(如
count
或name
)发生变化时,Solid.js 会标记这些变量为“脏”(dirty)。 - 对于每个标记为“脏”的变量,Solid.js 会检查依赖于该变量的所有副作用函数。
- 当响应式状态变量(如
- 避免重复执行:
- Solid.js 会批量处理状态变化。如果在一个更新周期内,多个依赖的响应式状态变量发生变化,Solid.js 只会执行一次依赖于这些变量的副作用函数,而不是每次变量变化都执行。
- 只有当副作用函数所依赖的状态变量实际发生变化时,副作用函数才会重新执行。如果状态变量的值没有改变,即使触发了更新操作,该副作用函数也不会执行,从而避免了不必要的重复执行。