代码实现
import { createSignal } from 'solid-js';
const UserList = () => {
const users = [
{ id: 1, name: 'Alice', age: 25 },
{ id: 2, name: 'Bob', age: 30 },
{ id: 3, name: 'Charlie', age: 35 }
];
const [highlightedId, setHighlightedId] = createSignal(null);
const handleClick = (id) => {
setHighlightedId(id);
};
return (
<ul>
{users.map(user => (
<li
key={user.id}
style={{ backgroundColor: highlightedId() === user.id? 'lightblue' : 'transparent' }}
onClick={() => handleClick(user.id)}
>
{user.name} - {user.age}
</li>
))}
</ul>
);
};
export default UserList;
key
在Solid.js列表渲染中对性能至关重要的原因
- 高效的DOM更新:在Solid.js中,
key
帮助框架识别哪些列表项发生了变化、添加或删除。当列表数据发生改变时,Solid.js会基于key
值来最小化DOM操作。例如,如果仅改变了某个用户的age
属性,Solid.js可以通过key
精准定位到该用户对应的DOM元素并更新相关部分,而不是重新渲染整个列表,从而提升性能。
- 保持组件状态:当列表项重新排序或部分项被删除时,
key
可以确保每个组件实例的状态得以正确维护。比如某个列表项内有一个输入框,用户输入了内容,如果没有正确的key
,重新渲染时该输入框可能会丢失输入内容,而正确的key
能让Solid.js识别该组件实例,保持其状态。
与其他框架在这方面实现的差异
- React:React也依赖
key
来进行高效的Diff算法,识别列表项的变化。然而,React的渲染机制是基于虚拟DOM的,在每次状态更新时会生成新的虚拟DOM树并与旧树进行比较,key
在这个比较过程中起到重要作用。而Solid.js采用的是细粒度的响应式系统,它并不像React那样频繁地生成和比较虚拟DOM树,而是直接在细粒度的响应式依赖上进行更新,key
同样用于优化DOM操作,但在实现原理上与React不同。
- Vue:Vue也使用
key
来追踪每个节点的身份,以优化更新性能。Vue在更新列表时,会根据key
来判断如何复用已有的DOM元素。Vue的响应式系统基于数据劫持,通过Object.defineProperty或Proxy来追踪数据变化。Solid.js的响应式系统基于信号(Signals),在列表渲染中key
的作用类似,但由于底层响应式实现不同,在实际应用场景和性能表现上会存在一些差异。