MST
星途 面试题库

面试题:Solid.js列表渲染的性能优化策略

在Solid.js的列表渲染场景下,当列表数据量较大时,会面临性能问题。请阐述至少两种优化列表渲染性能的策略,并结合Solid.js的特性说明如何实现这些策略。
38.6万 热度难度
前端开发Solid.js

知识考点

AI 面试

面试题答案

一键面试

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 的 createMemocreateResource 等函数。比如,可以将列表项渲染逻辑封装在 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 会重新计算,其他列表项保持缓存状态,减少不必要的渲染。