javascript - 如何将 propTypes 设置为 HOC 孩子?
问题描述
给定以下代码:
const PricingCard = withLanguage(({ t, onConfirm }) => {
const { colors } = useTheme();
return (
<RNPricingCard
color={colors.primary}
title="Premium"
price="$7"
info={t("premium.card.advantages")}
button={{
title: t("premium.card.becomePremiumPremium"),
titleStyle: styles.buttonTitle,
}}
onButtonPress={onConfirm}
/>
);
});
尝试将 propTypes 设置为 PricingCard,如下所示:
PricingCard.propTypes = {
t: PropTypes.func.isRequired,
onConfirm: PropTypes.func.isRequired,
};
产生错误,因为“t”方法由“withLanguage”给出。我该如何解决这个问题?
警告:失败的道具类型:道具
t
在 中标记为必填<<anonymous>>
,但其值为undefined
。
解决方案
PricingCard
is the result of calling the higher-order component, not the anonymous component you're wrapping (which is where you meant to apply prop types). If you want to add prop types for t
, move the anonymous component to a named variable like so:
const PricingCardImpl = ({ t, onConfirm }) => {
const { colors } = useTheme();
return (
<RNPricingCard
color={colors.primary}
title="Premium"
price="$7"
info={t("premium.card.advantages")}
button={{
title: t("premium.card.becomePremiumPremium"),
titleStyle: styles.buttonTitle,
}}
onButtonPress={onConfirm}
/>
);
}
PricingCardImpl.propTypes = {
t: PropTypes.func.isRequired,
onConfirm: PropTypes.func.isRequired,
};
const PricingCard = withLanguage(PricingCardImpl);
Even better would be to use a hook-based api for accessing t
. Or, you could skip the prop type for t
since you know for sure you're providing it via the withLanguage
HOC.
推荐阅读
- php - 将 ajax 调用转换为 fetch api 调用并将信息拉入 php 函数
- c# - 一种获得深层价值的安全方法
- ruby-on-rails - 由于存在资产,搜索机器人无法索引 rails heroku
- android - 未发送请求代码的片段中的 UCrop
- unity3d - UnityTest 没有在 MonoBehaviour 上调用 Update() 函数
- azure - 无法使用 Azure Function App 创建 API
- javascript - 用小写字母和连字符替换整个字符串中的大写字母
- visual-studio - 我可以将 Visual Studio 2019 解决方案的测试默认运行设置更新为 x64 吗?
- clojure - 如何打印向量中的元素
- if-statement - 使用单元格格式值的 IF 语句