状況 私はreduxsを使用してreactjsアプリを持っています。私はコンテナとプレゼンテーションコンポーネントを持っています。私のプレゼンテーションコンポーネントは、単純なテキスト入力フィールドの配列でフォームをレンダリングし、コンテナからプレゼンテーションコンポーネントに 'onChange'コールバック関数を渡して、テキストフィールドのいずれかが入力されたときに還元状態を変更するアクションを送出します。reactjsプレゼンテーションcomopnentは還元状態の変更で再レンダリングされません
問題 は、プレゼンテーションコンポーネントが正常にReduxの状態からテキストフィールドプレゼンテーションコンポーネントマウント用の正しい値をレンダリングするが、私はフィールドに入力すると更新されません。コンテナのmapStateToProps
のプレゼンテーションコンポーネントに渡されたプロップを記録すると、onChange関数がストアに正しくディスパッチされており、リフィックス状態が正しく更新されていることがわかります。しかし、プレゼンテーションコンポーネントは再レンダリングされませんので、テキストフィールドでの入力はビューを更新しません(何もしません)。
formConnector
import { connect } from 'react-redux'
import Form from '../components/Form'
import { changeElementValue } from '../actions/actions'
const mapStateToProps = (state) => {
//e.g. state.elements = [{id:"email", value:"[email protected]"}]
let props = {
elements: state.elements,
}
//state and props.elements.{id}.value changes successfully when I
//type in one of the input fields, but
//the the Form component is not re-rendered
console.log(props)
return props
}
const mapDispatchToProps = (dispatch) => {
return {
onElementChange: (id, value) => {
dispatch(changeElementValue(id, value))
},
}
}
export default connect(mapStateToProps, mapDispatchToProps)(Form)
フォーム減速
function formReducer(state = initialState, action = null) {
switch(action.type) {
case types.CHANGE_ELEMENT_VALUE:
let newState = Object.assign({}, state)
newState.elements[action.id].value = action.value
return newState
default:
return state;
}
}
アクション
import * as types from './actionTypes'
export function changeElementValue(id, value) {
return { type: types.CHANGE_ELEMENT_VALUE, id, value }
}
は、コンポーネントのコードと減速を添付することはできますか?あなたは店が変わったと確信していますか?あなたが取っている価値はstate.textField.valueに設定されていて、減速機が何を変えているのか分からないようです(idとそれが通過するID)。私は問題がその地域にあると確信している。 – Kinnza
@Kinnza見てくれてありがとう。私はこの記事のコードを単純化するために問題を隠してしまったという恐ろしい気持ちを持っています。私のコネクターは、実際には、テキスト要素のセットをレンダリングする 'Form'コンポーネントを接続します。したがって、stateにはid値のペアの配列が含まれています。ここに貼り付けるだけの簡単なコードでサンプルを書き直してみましょうが、問題を再現できるように実行することができます。その間、州内の配列に埋め込まれた値の変更であるため、私のコンポーネントは状態の変化を認識していないと考えられますか?不変を使用する必要がありますか? – xanld
OK、私は単純化されたコードを使用してプロトタイプを構築する機会はまだありませんでしたが(必要に応じて後で試してみます)、実際のアプリで何が起きているのかをよりよく表現できるようにサンプルを更新しました。今レンダリングされている要素の配列があります。もう一度、要素配列の値の1つが更新されたときの状態への変化を検出していないため、プレゼンテーションコンポーネント(フォーム)が再レンダリングされていないという私の感想はどうですか? – xanld