次のコードを考慮してください。このように動作するはずです。キーストロークはローカル状態を更新するはずで、ボタンがクリックされると、グローバル状態を更新する必要があります。コンポーネント自体もグローバルな状態を示す責任があります。React + Redux:グローバル状態がコンポーネントに供給されない理由
class App extends React.Component {
constructor(props) {
super(props);
this.state = { name: this.props.appState.name, localName: "" };
this.nameChanged = this.nameChanged.bind(this);
this.sendAction = this.sendAction.bind(this);
}
nameChanged(event) {
this.setState(Object.assign({}, this.state, { localName: event.target.value }));
}
sendAction(event) {
this.props.saveName(this.state.localName);
}
render() {
return (
<div>
<h1>Hello, {this.state.name}!</h1>
<input type="text" value={this.state.localName} onChange={this.nameChanged} />
<input type="button" value="Click me!" onClick={this.sendAction} />
</div>
);
}
}
const AppContainer = ReactRedux.connect(
state => ({ appState: state.appReducer.appState }),
dispatch => Redux.bindActionCreators({
saveName: (name) => ({ type: "SAVE_NAME", name })
}, dispatch)
)(App);
const appReducer = (state = { appState: { name: "World!" } }, action) => {
switch (action.type) {
case "SAVE_NAME":
return Object.assign({}, state, { name: action.name });
default:
return state;
}
};
const combinedReducers = Redux.combineReducers({
appReducer
});
const store = Redux.createStore(combinedReducers);
ReactDOM.render(
<ReactRedux.Provider store={store}>
<AppContainer />
</ReactRedux.Provider>,
document.getElementsByTagName('main')[0]
);
現時点では、ローカル状態が正しく更新されています。しかし、ボタンをクリックすると、アクションが作成されて送信されますが、UIの新しい値でグローバル状態が表示されません。グローバル状態が更新されていないか、コンポーネントが正しく通知されていないかどうかはわかりません。これに
での作業バージョンですか? – Mayday
変更されません(「世界!」)。 – Mehran
あなたは減速機にappStateを追加するのを忘れていますか?戻り値Object.assign({}、状態、{appState:{name:action.name}}); – Mayday