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
相关产品推荐
相关产品推荐

