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