react navite手写 FlatList 优化配置

如果你是在准备 React Native 高频手写题/面试题FlatList 优化配置建议直接记这一套:

ini 复制代码
<FlatList
  data={data}
  renderItem={renderItem}
  keyExtractor={(item) => String(item.id)}

  // ===== 核心性能优化 =====
  initialNumToRender={10}
  maxToRenderPerBatch={10}
  updateCellsBatchingPeriod={50}
  windowSize={5}

  // ===== 固定高度列表 =====
  getItemLayout={(_, index) => ({
    length: ITEM_HEIGHT,
    offset: ITEM_HEIGHT * index,
    index,
  })}

  // ===== 减少无意义刷新 =====
  removeClippedSubviews={true}

/>

1. 面试最重要的 5 个配置

配置 作用 怎么记
initialNumToRender 首屏渲染多少条 控制首次渲染
maxToRenderPerBatch 每批最多渲染多少条 控制批量渲染数量
updateCellsBatchingPeriod 两批渲染之间的时间间隔 控制批量渲染频率
windowSize 保留多少屏的列表项 控制内存占用
getItemLayout 提前计算 item 位置 固定高度必加

2. getItemLayout 是高频考点

比如每个 Item 高度固定 80

ini 复制代码
const ITEM_HEIGHT = 80;

const getItemLayout = (_, index) => ({
  length: ITEM_HEIGHT,
  offset: ITEM_HEIGHT * index,
  index,
});

这样 RN 不用逐个测量 Item 高度,可以直接计算:

ini 复制代码
第 0 个:offset = 0
第 1 个:offset = 80
第 2 个:offset = 160
第 3 个:offset = 240
...

尤其是:

scss 复制代码
scrollToIndex()

这种跳转操作,固定高度 + getItemLayout 非常有价值。


3. renderItem 也要优化

不要每次 render 都创建新的函数:

javascript 复制代码
// ❌
<FlatList
  data={data}
  renderItem={(item) => <Item item={item} />}
/>

可以:

ini 复制代码
const renderItem = useCallback(
  ({ item }) => <Item item={item} />,
  []
);

<FlatList
  data={data}
  renderItem={renderItem}
/>

Item 本身再配合:

javascript 复制代码
const Item = React.memo(({ item }) => {
  return (
    <View>
      <Text>{item.title}</Text>
    </View>
  );
});

核心思路就是:

markdown 复制代码
FlatList
   ↓
减少渲染数量
   +
减少重新渲染
   +
减少测量
   +
控制内存

4. 一套比较完整的"手写答案"

面试时可以直接写:

ini 复制代码
const ITEM_HEIGHT = 80;

const renderItem = useCallback(
  ({ item }) => <ListItem item={item} />,
  []
);

const keyExtractor = useCallback(
  (item) => String(item.id),
  []
);

const getItemLayout = useCallback(
  (_, index) => ({
    length: ITEM_HEIGHT,
    offset: ITEM_HEIGHT * index,
    index,
  }),
  []
);

return (
  <FlatList
    data={data}
    renderItem={renderItem}
    keyExtractor={keyExtractor}
    getItemLayout={getItemLayout}

    initialNumToRender={10}
    maxToRenderPerBatch={10}
    updateCellsBatchingPeriod={50}
    windowSize={5}

    removeClippedSubviews
  />
);
相关推荐
曹牧1 小时前
C#:文本文件读取
服务器·前端·c#
柚yuzumi1 小时前
前端优化,从少触发一次开始:防抖与节流
前端·javascript
默_笙1 小时前
🚤 CSS 布局的"圈地运动":BFC 就是浏览器的独立领地
前端·javascript
我爱写代码i1 小时前
AI对话绘画数字人源码 - uniapp前端
前端·人工智能·uni-app
OpenTiny社区2 小时前
太酷了!装上OpenTiny dsh‑genui这个插件,你的DeepSeek Harness点击就能干活了!
前端·ai编程
ModyQyW2 小时前
vite-plugin-uni-pages 更新了什么
前端·uni-app
前端大卫2 小时前
H5 渲染 PDF 并添加高亮的两种方案【附源码】
前端
因_崔斯汀3 小时前
用 AI 生成 Three.js 沉浸式网站,代码与 Skill 均已开源
前端·人工智能
墨狂之逸才3 小时前
React Native 横竖屏响应式布局实战:一套组件,少量覆盖样式
react native