面试题答案
一键面试实现思路
- 使用
createSignal
管理数据:Solid.js通过createSignal
创建响应式数据。在列表场景下,用一个信号来存储列表数据。 map
渲染列表:使用JavaScript的map
方法遍历列表数据,为每个列表项生成对应的DOM元素。- 处理数据变化:
- 部分数据更新:直接修改信号中的对应数据,Solid.js的响应式系统会自动检测变化并更新相关DOM。
- 数据顺序改变:更新信号中的数据顺序,Solid.js会重新渲染列表,以正确顺序呈现DOM。
- 数据批量删除:从信号数据中移除相关项,Solid.js会更新DOM,移除对应的元素。
- 使用
key
属性:为列表项添加唯一的key
属性,帮助Solid.js高效识别和更新列表项,避免不必要的重新渲染。
关键代码示例
import { createSignal, render } from 'solid-js';
// 创建响应式列表数据
const [items, setItems] = createSignal([
{ id: 1, value: 'item1' },
{ id: 2, value: 'item2' },
{ id: 3, value: 'item3' }
]);
const App = () => {
// 处理部分数据更新
const updateItem = (itemId, newValue) => {
setItems((prevItems) => prevItems.map(item =>
item.id === itemId ? { ...item, value: newValue } : item
));
};
// 处理数据顺序改变
const swapItems = (index1, index2) => {
setItems((prevItems) => {
const newItems = [...prevItems];
[newItems[index1], newItems[index2]] = [newItems[index2], newItems[index1]];
return newItems;
});
};
// 处理数据批量删除
const deleteItems = (itemIds) => {
setItems((prevItems) => prevItems.filter(item =>!itemIds.includes(item.id)));
};
return (
<div>
<ul>
{items().map(item => (
<li key={item.id}>
{item.value}
<input
type="text"
value={item.value}
onChange={(e) => updateItem(item.id, e.target.value)}
/>
</li>
))}
</ul>
<button onClick={() => swapItems(0, 1)}>Swap first two items</button>
<button onClick={() => deleteItems([1, 2])}>Delete first two items</button>
</div>
);
};
render(() => <App />, document.getElementById('app'));
上述代码展示了如何在Solid.js中实现列表渲染,并处理数据的复杂动态变化。通过createSignal
管理数据,map
渲染列表,以及定义函数处理不同类型的数据变化。同时,为列表项添加key
属性以优化性能。