代码之家  ›  专栏  ›  技术社区  ›  jcollum

.defaultProps是否适用于无状态的React组件?

  •  1
  • jcollum  · 技术社区  · 6 年前

    代码:

    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. 当我试图在没有必要道具的情况下创建它时,这难道不是一个错误吗?

    我唯一的结论是,默认值和道具类型不工作,如果你不使用 class createReactClass 声明组件。

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

    1 回复  |  直到 6 年前
        1
  •  5
  •   jcollum    6 年前

    也可以在无状态函数组件上使用defaultProps。可能是因为您像调用普通函数一样调用组件,而不是使用渲染器.创建要实例化组件:

      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();
      });
    });