像其他应用程序一样,为了渲染我的React应用程序的特定部分,我希望从我的后端API中接收一个项目列表。我已经创建了一个典型的Card组件来显示每个项目的数据。这个Card组件有一个父组件,这个父组件对所有的项目都是通用的。它应该是这样的。
<ParentComponent>
<CardItem headline image/>
</ParentComponent>
道具 headline
和 image
是必需的,所以理论上,我应该总是从我的API接收它们。因此,我在我的组件中把这些道具设置为需要。
CardItem.propTypes = {
headline: PropTypes.string.isRequired,
image: PropTypes.string.isRequired,
}
我们都知道,随着我们的应用的发展,它总是会发生一些特殊的原因,即使这些道具是必需的,我也可能收到一个未定义的值。出于这个原因,我喜欢把我的组件做得防弹,即使这些道具是必需的,我也总是做一个条件渲染,以避免应用崩溃。
{headline && (
<Component/>
)}
对于其他的组件,我只是在最上面检查道具是否存在,否则,我返回null。
if (!itemId) return null
在对我的组件进行单元测试的时候,我确保这个行为是经过测试的,所以如果我从API接收到任何未定义的vale,应用程序就不会崩溃。我已经意识到Jest因为这个原因一直警告我。
警告: Failed prop type: 在CardItem中,该道具标题被标记为需要,但其值未定义。
这让我怀疑我的方法是不是不对,所以我的疑问在这里。
请不要因为我在检查道具的时候影响了你的回答,比如说 headline
或 image
我知道对于这样的事情,我总是可以有条件的渲染。更多的是考虑到一个 itemId
或类似的,这些都是正确的渲染行为100%需要的道具。
在组件中,有一个选项 默认道具.
在这种情况下,你 得不到好处 的API。您可以 提供你自己的默认Props 的组件。
如果您使用的是 功能部件,它应该是这样的 以外
CardItem.defaultProps = {
headline: "YOUR_DEFAULT_VALUE",
image: "YOUR_DEFAULT_VALUE",
}
如果你使用的是 器件类,它将是这样的 课内
static defaultProps = {
headline: "YOUR_DEFAULT_VALUE",
image: "YOUR_DEFAULT_VALUE",
}
而这样做,你就不需要对道具进行验证。
你看,可能有多种情况,1.子代完全依赖父代获取数据,在这种情况下,如果props是undefinednull,父代就不应该渲染子代,即子代的渲染应该是防弹的。在这种情况下,如果props是undefinednull的话,父代不应该渲染子代,也就是说渲染子代应该是防弹的。但是你想采取的方法来了,就像上面的回答中提到的,有defaultProps.但是如果你不想用它,那么你可以试试这样的方法。
interface ComponentProps {
prop1?: string;
prop2?: number;
}
export const Component:React.FC<ComponentProps>=({prop1='',prop2=0})=>{
return(
// logic goes here
)};
现在当你测试这个组件时,Jest不会抱怨,你可以很容易地测试数值。