在无状态组件上添加默认道具
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在无状态组件上添加默认道具相关的知识,希望对你有一定的参考价值。
也许这是一个愚蠢的问题,但我不明白为什么我不能在像这样的无状态组件上添加基于另一个prop的默认值:
const Link = ({
children,
target,
rel = target === '_blank' && 'noopener noreferrer',
href,
...attributtes
}) => (
<a
{...attributtes}
target={target}
rel={rel}
href={href}
>
{children}
</a>
);
Link.defaultProps = {
children: <div />,
target: null,
rel: null,
};
Link.propTypes = {
children: PropTypes.node,
href: PropTypes.string.isRequired,
target: PropTypes.string,
rel: PropTypes.string,
};
export default Link;
答案
除非传递undefined
,否则不使用默认参数值。这是一个简单的例子,说明这里发生了什么。
function test(a="foo", b="bar") {
console.log(a, b);
}
test(undefined, null);
// prints "foo null"
要么从你的target
中移除rel
和defaultProps
,要么将它们设置为undefined
。
Link.defaultProps = {
children: <div />,
target: undefined,
rel: undefined,
};
另一答案
您可以尝试将target
传递给返回默认值的函数:
const Link = ({
children,
target,
rel = getRel(target),
href,
...attributtes
}) => (
<a
{...attributtes}
target={target}
rel={rel}
href={href}
>
{children}
</a>
);
Link.defaultProps = {
children: <div />,
target: null,
rel: null,
};
Link.propTypes = {
children: PropTypes.node,
href: PropTypes.string.isRequired,
target: PropTypes.string,
rel: PropTypes.string,
};
const getRel = target => target === '_blank' && 'noopener noreferrer';
export default Link;
未经测试,所以不确定target
是否会正确传递,但我知道你可以使用函数返回值作为默认参数值https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Default_parameters。
以上是关于在无状态组件上添加默认道具的主要内容,如果未能解决你的问题,请参考以下文章
使用 get API 调用反应全局状态/道具(没有 Redux)