传递t函数作为prop至memo组件时翻译失效,求解决方案
解决React Native中memo包装组件传入useTranslation的t函数后翻译失效问题
问题原因
你自定义的isEqual比较函数只对比了name属性,完全忽略了t函数的变化。每次语言切换或者useTranslation内部状态更新时,返回的t函数会生成新的引用,但你的比较逻辑认为只要name相同就不需要重新渲染组件,导致组件无法获取新的t函数,翻译内容也就不会更新。
解决方案
方案1:修复isEqual比较逻辑
修改isEqual函数,加入对t函数的对比,确保当t变化时组件能重新渲染:
function isEqual(prev: IMyOrders & { t: any }, next: IMyOrders & { t: any }) { // 对比name的同时,确保t引用变化时触发重新渲染 return prev.name === next.name && prev.t === next.t; } const Item = ({ name, t }: { name: string; t: any; }) => { // 注意:需补充order_date变量定义,原代码未体现该变量 return ( <Pressable style={s.item}> <Text style={s.product_name}>Ordered Date: { t('profile.logged.reviews.created_at', { date: order_date }) }</Text> </Pressable> ); }; const MEMO_ITEM = memo(Item, isEqual);
注:如果
t函数的引用在语言未切换时也会频繁变化,这种方法可能降低memo的优化效果,此时更推荐方案2。
方案2:在Item组件内部直接使用useTranslation
不需要把t作为prop传入,而是在Item组件内部调用useTranslation,这样memo只需要对比业务属性,语言变化时组件会自动响应:
// 移除t prop,组件内部直接调用useTranslation const Item = ({ name }: { name: string; }) => { const { t } = useTranslation(); // 补充order_date变量定义 return ( <Pressable style={s.item}> <Text style={s.product_name}>Ordered Date: { t('profile.logged.reviews.created_at', { date: order_date }) }</Text> </Pressable> ); }; // 此时isEqual只需对比业务属性name function isEqual(prev: IMyOrders, next: IMyOrders) { return prev.name === next.name; } const MEMO_ITEM = memo(Item, isEqual);
父组件中无需再传递t:
const renderItem: ListRenderItem<IMyOrders> = ({ item }) => ( <MEMO_ITEM {...item} /> );
这种方案更简洁,既能保留memo的优化效果,又能保证翻译功能正常响应语言变化。
内容的提问来源于stack exchange,提问作者localdata01
相关产品推荐
相关产品推荐

