面试题答案
一键面试1. 虚拟列表
- 原理:只渲染当前可见区域的列表项,而非全部列表项,极大减少 DOM 操作,提升性能。
- Solid.js 实现:可利用
@solid-primitives/virtual-list
库。该库提供了虚拟列表相关的功能。首先安装此库,然后在代码中引入并使用其提供的组件和函数。例如:
import { createSignal } from 'solid-js';
import { VirtualList } from '@solid-primitives/virtual-list';
const data = Array.from({ length: 10000 }, (_, i) => `Item ${i}`);
const [itemsPerPage] = createSignal(20);
const App = () => {
return (
<VirtualList
items={data}
itemsPerPage={itemsPerPage()}
itemSize={30}
>
{(item, index) => <div key={index}>{item}</div>}
</VirtualList>
);
};
这里 VirtualList
组件根据可见区域动态渲染列表项,itemsPerPage
控制每页显示的项数,itemSize
定义每个列表项高度(用于计算滚动位置等)。
2. 列表项缓存
- 原理:缓存已经渲染过的列表项,避免重复创建和销毁相同的 DOM 元素,从而提升性能。
- Solid.js 实现:利用 Solid.js 的
createMemo
和createResource
等函数。比如,可以将列表项渲染逻辑封装在createMemo
中。假设我们有一个简单的列表项渲染函数renderListItem
:
import { createSignal, createMemo } from 'solid-js';
const listData = createSignal([{ id: 1, value: 'a' }, { id: 2, value: 'b' }]);
const renderListItem = (item) => {
return <div>{item.value}</div>;
};
const memoizedList = createMemo(() => {
return listData().map((item) => {
return createMemo(() => renderListItem(item));
});
});
const App = () => {
return (
<div>
{memoizedList().map((memoizedItem) => memoizedItem())}
</div>
);
};
这里外层 createMemo
依赖 listData
,内部 createMemo
缓存每个列表项的渲染结果。当 listData
变化时,只有发生变化的列表项对应的 createMemo
会重新计算,其他列表项保持缓存状态,减少不必要的渲染。