面试题答案
一键面试- 优化思路:
- 减少
createMemo
的依赖范围,只让其依赖真正影响计算结果的 props。这样当其他不相关的 props 变化时,createMemo
不会重新计算。
- 减少
- 可能用到的技术:
- 手动提取依赖:从传递下来的多个 props 中,手动提取出真正影响计算结果的 props 并作为
createMemo
的依赖。例如,如果顶层组件传递了props1
,props2
,props3
,props4
,而只有props2
和props4
影响createMemo
的计算,那么createMemo
的依赖就只设置为props2
和props4
。示例代码如下:
- 手动提取依赖:从传递下来的多个 props 中,手动提取出真正影响计算结果的 props 并作为
import { createMemo } from'solid-js';
const DeepComponent = ({ props1, props2, props3, props4 }) => {
const memoizedValue = createMemo(() => {
// 这里的计算只依赖 props2 和 props4
return props2 + props4;
});
return <div>{memoizedValue()}</div>;
};
- 使用
createSelector
(类似 Redux - reselect 的思路):虽然 Solid.js 本身没有createSelector
,但可以自行实现类似功能。这个函数接收多个依赖值和一个计算函数,只有当依赖值变化时才会重新计算。例如:
import { createMemo } from'solid-js';
const createSelector = (...depsAndFunc) => {
const deps = depsAndFunc.slice(0, -1);
const func = depsAndFunc[depsAndFunc.length - 1];
return createMemo(() => {
const depValues = deps.map(dep => dep());
return func(...depValues);
});
};
const DeepComponent = ({ props1, props2, props3, props4 }) => {
const memoizedValue = createSelector(
() => props2,
() => props4,
(p2, p4) => {
return p2 + p4;
}
);
return <div>{memoizedValue()}</div>;
};
这样,只有当 props2
或 props4
变化时,createMemo
(这里通过 createSelector
包装)才会重新计算,避免了因 props1
和 props3
变化导致的不必要计算。