面试题答案
一键面试1. 避免不必要的重新计算
- 原理:
createMemo
会缓存计算结果,只有当它的依赖发生变化时才会重新计算。在频繁更新场景下,要确保createMemo
的依赖尽可能少且精准。 - 做法:将频繁更新但对
createMemo
计算结果无影响的数据排除在createMemo
的依赖之外。
2. 处理依赖关系以提高效率
- 精确依赖:明确
createMemo
真正依赖的createSignal
。如果一个createSignal
的值变化不会影响createMemo
的计算结果,就不应将其作为依赖。 - 嵌套使用:对于复杂的数据处理,可以通过嵌套
createMemo
来分层处理依赖,避免将所有计算都放在一个createMemo
中导致依赖关系过于复杂。
代码优化示例
import { createSignal, createMemo } from 'solid-js';
// 创建信号
const [count, setCount] = createSignal(0);
const [name, setName] = createSignal('');
// 优化前,包含不必要的依赖
const badMemo = createMemo(() => {
// 这里即使name变化,countComputedValue也不应该重新计算
return count() * 2;
});
// 优化后,精准依赖
const goodMemo = createMemo(() => {
return count() * 2;
});
function App() {
return (
<div>
<button onClick={() => setCount(count() + 1)}>Increment Count</button>
<input type="text" onChange={(e) => setName(e.target.value)} />
{/* 使用优化后的 memo */}
<p>Optimized Memo: {goodMemo()}</p>
{/* 使用优化前的 memo */}
<p>Bad Memo: {badMemo()}</p>
</div>
);
}
export default App;
在上述代码中,badMemo
将name
信号也包含在了依赖中,这会导致即使name
变化不影响countComputedValue
,badMemo
也会重新计算。而goodMemo
只依赖count
信号,避免了不必要的重新计算,从而提高了性能。