You need to enable JavaScript to run this app. React Native中不使用箭头函数是否可以使用memo或useMemo?
优惠活动
大模型
产品
解决方案
定价
更多

React Native中不使用箭头函数是否可以使用memo或useMemo?

解答

该需求完全可以实现。首先需要纠正你现有代码的用法问题:你当前将组件函数直接定义在useMemo的入参位置,这一写法本身还是会在每次组件重渲染时创建新的箭头函数实例,只是useMemo会根据依赖判断是否返回新的缓存值,并没有解决你担心的重复创建实例问题。


方案1:提取渲染逻辑到组件外部(推荐)

将渲染逻辑完全提到组件外部,使用普通函数声明,整个应用生命周期内只会创建一次函数实例,完全不存在重复创建的问题,性能最优。

import React, { memo } from 'react';
import { StyleSheet, Text, View, FlatList, TextInput, TouchableOpacity, Image, Dimensions } from 'react-native';

// 完全使用普通函数声明,无箭头函数,仅初始化一次
function RenderItem({item}) {
  return (
    <Text>{item.title}</Text>
  )
}
// 用memo包裹避免不必要的重渲染
const MemoRenderItem = memo(RenderItem)

// 提取key提取逻辑,也可避免箭头函数
function keyExtractor(item) {
  return item.item.product_id
}

const Shopping_cart = ({ datas, onPressSetting }) => {
  return (
    <FlatList 
      data={datas}
      keyExtractor={keyExtractor}
      renderItem={MemoRenderItem} // 直接传入缓存后的组件,无需额外包装
    />
  )
};

方案2:组件内使用普通函数搭配useCallback缓存

如果渲染逻辑需要依赖当前组件内部的状态/属性,不想提取到外部,可以在组件内用普通函数声明,搭配useCallback缓存函数引用,只要依赖数组不变,函数实例就不会更新。

import React, { useCallback } from 'react';
import { StyleSheet, Text, View, FlatList, TextInput, TouchableOpacity, Image, Dimensions } from 'react-native';

const Shopping_cart = ({ datas, onPressSetting }) => {
  // 普通函数声明,无箭头函数,useCallback缓存实例
  const renderItem = useCallback(function renderItem({item}) {
    return (
      <Text>{item.title}</Text>
    )
  }, [])

  const keyExtractor = useCallback(function keyExtractor(item) {
    return item.item.product_id
  }, [])

  return (
    <FlatList 
      data={datas}
      keyExtractor={keyExtractor}
      renderItem={renderItem}
    />
  )
};

补充说明:箭头函数本身的性能开销极低,只有当函数作为属性传递给子组件、可能引发子组件不必要重渲染时才需要做引用稳定优化,上述两种方案都可以完全规避箭头函数的使用,同时满足性能要求。

内容的提问来源于stack exchange,提问作者locklock123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 16:18:03