.defaultProps是否可与无状态React组件一起使用?

时间:2018-09-12 17:50:54

标签: javascript reactjs unit-testing jestjs

代码:

export default function RoundedLink({ url, text, className, target }) {
  return (
    <a
      className={`${buttonCorners} ncss-btn-medium border-black ncss-brand pt2-sm pr5-sm pb2-sm pl5-sm ${className}`}
      href={url}
      rel="noopener"
      target={target}
    >
      {text}
    </a>
  );
}

RoundedLink.defaultProps = {
  className: '',
  target: '_self',
};

RoundedLink.propTypes = {
  url: string.isRequired,
  text: string.isRequired,
  className: string,
  target: string,
};

但是当我对其进行测试时,我在类名和目标中得到了undefined

expect(RoundedLink({})).toMatchSnapshot();

...

 <a
    className="css-1by5joz ncss-btn-medium border-black ncss-brand pt2-sm pr5-sm pb2-sm pl5-sm undefined"
    href={undefined}
   rel="noopener"
   target={undefined}
  />
  1. 当我尝试在没有必需道具的情况下创建它时,这不会出错吗?

  2. 为什么默认道具没有填充?

我唯一的结论是,如果不使用classcreateReactClass来声明组件,则默认值和prop类型将不起作用。

https://reactjs.org/docs/react-without-es6.html#declaring-default-props

1 个答案:

答案 0 :(得分:3)

您还可以在无状态功能组件上使用defaultProps。可能是因为您正在像正常函数一样调用该组件,而不是使用renderer.create实例化该组件,所以出现了这种现象:

  const tree = renderer.create(<RoundedLink />).toJSON();
  expect(tree).toMatchSnapshot();

完整示例:

import TestRenderer from 'react-test-renderer';
import React from 'react';
import RoundedLink from './RoundedLink';

describe('<RoundedLink />', () => {
  test('#render', () => { 
    const tree = TestRenderer.create(<RoundedLink />).toJSON();
    expect(tree).toMatchSnapshot();
  });
});