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