次のコードがあります。
const CatalogContainer = () => (
<Match
pattern="/catalog/:id"
exactly
render={({ params }) => (
<Redirect to={`/catalog/${params.id}/titles`} />
)}
/>
)
しかし、ESLint は が原因で次の警告をスローしています=>
。これは (AFAIK)render
呼び出しごとに関数の新しい参照を作成するため、悪い習慣であり、私はそれを望んでいません。
警告 JSX props should not use arrow functions react/jsx-no-bind
したがって、次のような専用のシンプルなコンポーネントを使用して、これをリファクタリングしようとしています。
const DefaultRedirect = (params) => (
<Redirect to={`/catalog/${params.id}/titles`} />
);
でも、使い方が分からなくて困っています。
component
まず、属性の代わりに使用する必要があると思いますrender
が、よくわかりませんし、これに関する適切なドキュメントもまだ見つかりません。(編集: https://react-router.now.sh/Match ここに v4 のドキュメントがあります)
以下を含むいくつかのことを試しましたが、うまくいきません。
<Match
pattern="/catalog/:id"
exactly
component={DefaultRedirect({ params })}
/>
いくつかの例を見つけましたが、それらはすべて を使用しています。これは、ステートレス コンポーネントに対して何かを行うための新しい「最良の」方法であるように見えるためReact.createClass
、むしろ使用したくありません。const
考えられる解決策の 1 つは、React.Component を拡張する Class を使用することです。しかし、それは間違っていると感じています。(そしてESLintはそれに関するエラーを表示しています)
コンポーネントは純粋な関数として記述する必要があります
react/prefer-stateless-function
class DefaultRedirect extends React.Component {
render() {
const { params } = this.props;
return (
<Redirect to={`/catalog/${params.businessMid}/titles`} />
);
}
}
メソッドに関するドキュメントからrender
: ( https://react-router.now.sh/Match )
コンポーネントをレンダリングする代わりに、場所が一致したときに呼び出される関数を渡すことができます。render 関数は、コンポーネントに渡されるものと同じ props で呼び出されます。 これにより、便利なインライン マッチのレンダリングとラッピングが可能になります。
便利かもしれませんが、良い習慣とは見なされません。
代わりに純粋な関数を使用してそれを行う方法はありますか?