前提・実現したいこと
例えばclickerという名前のReducerと、store上のclickerのデータを参照するClickerというComponentがあるとします。
このClickerというComponentを複数箇所で使う場合、storeの中にはclickerという名前のものが1つしかないのですが、それぞれの使用箇所で独立した状態で管理するにはどのように書くのが一般的なのでしょうか?そもそもこのように汎用的なComponentの内部情報をReduxで管理するのが間違いなのでしょうか?
発生している問題・エラーメッセージ
別々のデータをstoreで扱いたいが、共通になってしまう。
該当のソースコード
JavaScript
1// actions/clicker.js 2function clickerClick() { 3 return {type:'clicker.click'}; 4} 5const ClickerActions = { 6 clickerClick 7}; 8export default ClickerActions;
JavaScript
1// reducers/clicker.js 2const initialState = {value:0} 3function clicker(state=initialState, action) { 4 switch(action.type) { 5 case 'clicker.click': 6 let ret = Object.assign({}, state); 7 ret.value++; 8 return ret; 9 } 10 return state; 11}
JavaScript
1// reducers/main.js 2const mainApp = combineReducers({ 3 main, 4 clicker, // ←reducers/clicker.js 5}); 6 7export default mainApp;
JavaScript
1// components/Clicker.js 2class Clicker extends Component { 3 render() { 4 return <div onClick={e=>this.props.actions.clickerClick()}>{this.props.clicker.value}</div>; 5 } 6} 7function mapStateToProps(state) { 8 return {clicker:state.clicker}; 9} 10function mapDispatchToProps(dispatch) { 11 return { 12 actions: bindActionCreators(Object.assign({}, ClickerActions), dispatch) 13 }; 14} 15 16export default connect(mapStateToProps, mapDispatchToProps)(Clicker);
この状態で<Clicker>を複数箇所に使用したとき、storeにはclickerという入れ物は1つしかないので相互に影響してしまうため、独立したデータで持ちたい。
JavaScript
1class Hoge extends Component { 2 render() { 3 return ( 4 <div> 5 <div> 6 <h1>Clicker 1</h1> 7 <Clicker/> 8 </div> 9 <div> 10 <h1>Clicker 2</h1> 11 <Clicker/> 12 </div> 13 <div>; 14 } 15}
このように複数箇所で使用した場合、Clicker 1とClicker 2で独立したデータを持てるようにしたいです。Clicker 1で発生したactionはClicker 1にのみ影響を与えるようにしたいです。いまのままだとClicker 1が書き換わるとClicker 2も同時に書き換わってしまいます。そもそもreducerがclickerという共通のものを使ってしまう以上、store内に保存されるデータを別々にすることは出来ないのでしょうか?
試したこと
いろいろ調べようとしているのですが、どういう用語で調べたものかわからず、なかなか情報に行き当たりません…
【追記】
この方も同じような悩みを抱えているようです。しかしスマートな解決法は見つかっていないようです…
https://qiita.com/derui@github/items/8272c5cb7eb7fc3ecd67
補足情報(FW/ツールのバージョンなど)
package.json一部抜粋
"react": "^16.2.0", "react-redux": "^5.0.7", "redux": "^3.7.2",
回答3件