在无状态组件上添加默认道具

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中移除reldefaultProps,要么将它们设置为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

以上是关于在无状态组件上添加默认道具的主要内容,如果未能解决你的问题,请参考以下文章

在无状态子组件中传递/访问道具

如何在 React 组件上设置组件默认道具

使用 get API 调用反应全局状态/道具(没有 Redux)

react-native 中的小问题活动指标 |组件 |组件内的道具 |道具 |设置状态

将状态作为道具传递给子组件不起作用

即使该组件的道具或状态没有改变,也会调用 React shouldComponentUpdate()