You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

传递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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:45:36