React の双方向データバインディングの実装方法
React では、双方向データバインディングは次の2つの方法で実現できます。
- コントロールされたコンポーネントを使用します。制御されたコンポーネントとは、Reactコンポーネントのstateまたはpropsによって値が制御されるフォーム要素のことです。フォームの値に変更があったとき、イベント処理関数によってコンポーネントのstateまたはpropsが更新され、コンポーネントが再描画してフォームの値を更新します。
制御されたコンポーネントを使用した双方向データバインディングの実装方法を示す例を次に示します。
import React, { useState } from 'react';
function App() {
const [inputValue, setInputValue] = useState('');
const handleChange = (event) => {
setInputValue(event.target.value);
};
return (
<div>
<input type="text" value={inputValue} onChange={handleChange} />
<p>{inputValue}</p>
</div>
);
}
export default App;
上記のコードでは、input要素の値はinputValue状態変数でコントールされており、inputの値が変更されるとhandleChangeイベント処理関数が起動して、inputValueの値を更新して、双方向データバインディングを実現しています。
- react-redux
- 接続
React-reduxライブラリはconnectというメソッドを提供しており、ReactコンポーネントとReduxのstoreを関連付けることができます。connectメソッドを使用すると、状態をコンポーネントのpropsにマップするmapStateToProps関数を定義したり、dispatch関数をコンポーネントのpropsにマップするmapDispatchToProps関数を定義したりできます。
connect メソッドを用いることで双方向のデータバインディングが実現でき、コンポーネントの props の変更は Redux の state に同期し、 Redux の state の変更はコンポーネントの props に同期する。
以下は、react-reduxを使用している例です。
import React from 'react';
import { connect } from 'react-redux';
function App({ inputValue, updateInputValue }) {
const handleChange = (event) => {
updateInputValue(event.target.value);
};
return (
<div>
<input type="text" value={inputValue} onChange={handleChange} />
<p>{inputValue}</p>
</div>
);
}
const mapStateToProps = (state) => {
return {
inputValue: state.inputValue
};
};
const mapDispatchToProps = (dispatch) => {
return {
updateInputValue: (value) => dispatch({ type: 'UPDATE_INPUT_VALUE', value })
};
};
export default connect(mapStateToProps, mapDispatchToProps)(App);
上のコードでは、 connect メソッドを用いてコンポーネント App と Redux の store が接続されています。 mapStateToProps 関数は Redux の state 内の inputValue をコンポーネントの inputValue props にマッピングし、 mapDispatchToProps 関数は Redux の state を更新するために利用される updateInputValue 関数をコンポーネントの updateInputValue props にマッピングしています。
入力の値が変化するとhandleChangeイベントハンドラ関数が発動し、updateInputValue関数が呼び出され、Reduxのstateが更新され、この結果としてコンポーネントのinputValueプロップが更新され、双方向データバインディングが実現されます。