面试题答案
一键面试思路
- 细粒度依赖管理:使用
createMemo
时,确保其依赖项是尽可能细粒度的,避免依赖不必要的数据,这样可以减少不必要的重新计算。 - 局部状态管理:对于每个列表项,将其状态管理独立化,避免一个列表项的变化影响到其他无关列表项所依赖的
createMemo
。 - 使用
on
事件处理:在处理列表项变化时,精确控制更新逻辑,只有在真正相关的数据变化时才触发createMemo
的重新计算。
关键代码片段
import { createSignal, createMemo, on } from 'solid-js';
// 示例数据
const list = createSignal([
{ id: 1, value: 'a', dependentValue: null },
{ id: 2, value: 'b', dependentValue: null }
]);
// 创建createMemo
const memoizedValue = createMemo(() => {
return list().map(item => {
// 这里进行复杂计算,假设依赖于item.value
return item.value.toUpperCase();
});
});
// 处理列表项变化
const handleItemChange = (itemId, newValue) => {
on(() => {
const newList = list().map(item => {
if (item.id === itemId) {
return {...item, value: newValue };
}
return item;
});
list(newList);
}, []);
};
// 渲染部分
const App = () => {
return (
<div>
{list().map(item => (
<div key={item.id}>
<input
type="text"
value={item.value}
onChange={(e) => handleItemChange(item.id, e.target.value)}
/>
{/* 显示依赖于createMemo计算的值 */}
<span>{memoizedValue()[list().findIndex(i => i.id === item.id)]}</span>
</div>
))}
</div>
);
};
export default App;
在上述代码中:
createMemo
依赖于list
,但计算逻辑仅依赖于列表项的value
属性,实现细粒度依赖。handleItemChange
使用on
事件处理,精确控制列表项变化时的更新逻辑,避免过度触发createMemo
。- 渲染部分通过索引关联列表项和
memoizedValue
中的对应计算值,确保正确更新相关视图。