React + FlowtypeでStateless Functionsなコンポーネントを作る

Stateless Functionsなコンポーネントとは ザックリ書くとただJSXを返すだけのコンポーネントです。 import React from ‘react’; const Item = (prop) =&g […]

広告ここから
広告ここまで

目次

    Stateless Functionsなコンポーネントとは

    ザックリ書くとただJSXを返すだけのコンポーネントです。

    import React from 'react';
    const Item = (prop) => (
      <div>{props.title}</div>
    );
    

    こんな感じ。

    handleXXXXのようなfunctionを持つComponentクラスをextendしたものは内部でstateが変わるのでstatelessではないですね。

    propをflowtypeで検証する

    functionとして書くので、flowでの検証も同様になります。

    // @flow
    import React from 'react';
    type Props = {
      title: string,
      handleClick: Function,
    };
    
    const Item = ({title, handleClick}: Props) => (
      <div onClick={handleClick}>{props.title}</div>
    );
    

    PropTypesとの併用時の注意点

    PropTypesからの切り替え時にどっちも書かれている場所が出ることもあるかなと思います。

    そんな時は、ESLintのreact/default-props-match-prop-typesに要注意です。

    // @flow
    import React from 'react';
    import PropTypes from 'prop-types';
    type Props = {
      title: string,
      handleClick: Function,
    };
    
    const Item = ({title, handleClick}: Props) => (
      <div onClick={handleClick}>{props.title}</div>
    );
    
    Item.propTypes = {
      title: PropTypes.string,
      handleClick: PropTypes.func.isRequired,
    }
    Item.defaultProps = {
      title: 'no title'
    }
    

    こんな感じでFlowで型定義してるものに対してdefaultPropsを設定すると怒られます。

    29:3  error  defaultProp "title" defined for isRequired propType  react/default-props-match-prop-types
    

    @flowしたコンポーネントにPropTypesは要らない

    FlowTypeがあればPropTypes要らないので、大人しく消しちゃいましょう。

    // @flow
    import React from 'react';
    type Props = {
      title: string,
      handleClick: Function,
    };
    
    const Item = ({title = 'no title', handleClick}: Props) => (
      <div onClick={handleClick}>{props.title}</div>
    );
    
    広告ここから
    広告ここまで
    Home
    Search
    Bookmark