React.memo和useMemo結(jié)合使用的例子

正確示例:React.memo + useMemo

1?? 子組件(只關(guān)心 props) //

const Item = React.memo(({title, style, onPress}) => {
  console.log('render item');

  return (
    <Pressable style={style} onPress={onPress}>
      <Text>{title}</Text>
    </Pressable>
  );
});

2?? 父組件(用 useMemo 穩(wěn)定引用)

function List() {
  const [selectedId, setSelectedId] = useState(null);

  const renderItem = ({item}) => {
    const selected = selectedId === item.id;

    const itemStyle = useMemo(
      () => ({
        backgroundColor: selected ? 'red' : 'white',
        padding: 12,
      }),
      [selected],
    );

    const onPress = useCallback(() => {
      setSelectedId(item.id);
    }, [item.id]);

    return (
      <Item
        title={item.title}
        style={itemStyle}
        onPress={onPress}
      />
    );
  };

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

? 用 useMemo

父 render
→ selected 沒變
→ useMemo 返回同一個(gè) style 引用
→ React.memo 判定 props 沒變
→ Item 跳過 render

四、FlatList 的「完整版推薦寫法」

? 工業(yè)級(jí)模板(直接用)

const Item = React.memo(({item, selected, onPress}) => {
  const style = useMemo(() => ({
    backgroundColor: selected ? 'red' : 'white',
    padding: 12,
  }), [selected]);

  return (
    <Pressable style={style} onPress={onPress}>
      <Text>{item.title}</Text>
    </Pressable>
  );
});

function List({data}) {
  const [selectedId, setSelectedId] = useState(null);

  const onPressItem = useCallback((id) => {
    setSelectedId(id);
  }, []);

  const renderItem = useCallback(
    ({item}) => (
      <Item
        item={item}
        selected={item.id === selectedId}
        onPress={() => onPressItem(item.id)}
      />
    ),
    [selectedId, onPressItem],
  );

  return <FlatList data={data} 
            keyExtractor={item => item.id.toString()} //必須是唯一
            renderItem={renderItem} />;
}

導(dǎo)致memo無效的錯(cuò)誤的問題
? 1. props 引用每次都變

<Item
  item={item}
  style={{ backgroundColor: 'red' }} // ?
/>

解釋
“你 key 沒變,但 props 變了”

? 2. renderItem 沒 useCallback 必須使用useCallback

const renderItem = ({item}) => (
  <Item item={item} />
);

? 3. extraData 亂用

<FlatList
  extraData={list} // ?
/>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容