componentWillMount
関数でredux状態の変更をディスパッチするReactコンポーネントがあります。その理由は、コンポーネントがロードされたときに、URL(react-router
によって提供)からid
を取得し、そのid
のデータで状態を設定するアクションをトリガする必要があるためです。ここでreduxをcomponentWillMountで使用すると反応コンポーネントが2回レンダリングされないようにする
がコンポーネントである:
class Editor extends React.Component {
componentWillMount() {
const { dispatch, params } = this.props
dispatch(editItem(params.id))
}
render() {
const item = this.props.item
console.log("Editing", item)
}
}
export default connect(state => ({item: state.item}))(Editor)
ここでキャッチです:render
は二回と呼ばなっています。 item
は最初の呼び出しでは定義されておらず、2番目の呼び出しでは有効です。理想的には、(editItem
アクションが送出されて実行された後に)this.props.item
が実際に存在する場合にのみ呼び出されるのが理想です。 React docsによると
:「あなたは、このメソッド内でsetState
を呼び出す場合、render()
が更新された状態が表示され、状態変化にもかかわらず、一度だけ実行されます。」
reduxでは、dispatch
は、setState
を呼び出すことに相当します。これは状態が変化するためです。しかし、私は方法で何かを推測しているconnect
の作品はまだrender
を2回呼び出す原因となっています。
if (!item) return;
のような行を追加する以外に方法がありますか?
'return LoaderComponent? :null' –
incleaf