teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

6

参考URL追加。

2018/03/23 06:33

投稿

masaya_ohashi
masaya_ohashi

スコア9210

title CHANGED
File without changes
body CHANGED
@@ -85,6 +85,11 @@
85
85
 
86
86
  いろいろ調べようとしているのですが、どういう用語で調べたものかわからず、なかなか情報に行き当たりません…
87
87
 
88
+ 【追記】
89
+ この方も同じような悩みを抱えているようです。しかしスマートな解決法は見つかっていないようです…
90
+ [https://qiita.com/derui@github/items/8272c5cb7eb7fc3ecd67](https://qiita.com/derui@github/items/8272c5cb7eb7fc3ecd67)
91
+
92
+
88
93
  ### 補足情報(FW/ツールのバージョンなど)
89
94
  package.json一部抜粋
90
95
  ```

5

実際に使うようなシーンを想定したクラスに変更。

2018/03/23 06:33

投稿

masaya_ohashi
masaya_ohashi

スコア9210

title CHANGED
File without changes
body CHANGED
@@ -1,30 +1,29 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- 例えばhogeという名前のReducerと紐付いていHogeというComponentがあるとします。このHogeというComponentを、AとBというComponent両方で使う場合、storeの中にはhogeという名前のものが1つしかないのですが、A、B両方で独立した状態で管理するにはどのように書くのが一般的なのでしょうか?そもそもこのように小型のComponentの内部情報をReduxで管理するのが間違いなのでしょうか?
3
+ 例えばclickerという名前のReducerと、store上のclickerのデータを参照すClickerというComponentがあるとします。
4
+ このClickerというComponentを複数箇所で使う場合、storeの中にはclickerという名前のものが1つしかないのですが、それぞれの使用箇所で独立した状態で管理するにはどのように書くのが一般的なのでしょうか?そもそもこのように汎用的なComponentの内部情報をReduxで管理するのが間違いなのでしょうか?
4
5
 
5
6
  ### 発生している問題・エラーメッセージ
6
- AとB別々のデータをstoreで扱いたいが、共通になってしまう。
7
+ 別々のデータをstoreで扱いたいが、共通になってしまう。
7
8
 
8
9
  ### 該当のソースコード
9
10
 
10
- 例として、Clickするたびにカウントが1増える<Hoge>というComponentを作ります。
11
-
12
11
  ```JavaScript
13
- // actions/hoge.js
12
+ // actions/clicker.js
14
- function hogeClick() {
13
+ function clickerClick() {
15
- return {type:'hoge.click'};
14
+ return {type:'clicker.click'};
16
15
  }
17
- const HogeActions = {
16
+ const ClickerActions = {
18
- hogeClick
17
+ clickerClick
19
18
  };
20
- export default HogeActions;
19
+ export default ClickerActions;
21
20
  ```
22
21
  ```JavaScript
23
- // reducers/hoge.js
22
+ // reducers/clicker.js
24
23
  const initialState = {value:0}
25
- function hoge(state=initialState, action) {
24
+ function clicker(state=initialState, action) {
26
25
  switch(action.type) {
27
- case 'hoge.click':
26
+ case 'clicker.click':
28
27
  let ret = Object.assign({}, state);
29
28
  ret.value++;
30
29
  return ret;
@@ -36,48 +35,51 @@
36
35
  // reducers/main.js
37
36
  const mainApp = combineReducers({
38
37
  main,
39
- hoge, // ←reducers/hoge.js
38
+ clicker, // ←reducers/clicker.js
40
39
  });
41
40
 
42
41
  export default mainApp;
43
42
  ```
44
43
 
45
44
  ```JavaScript
46
- // components/Hoge.js
45
+ // components/Clicker.js
47
- class Hoge extends Component {
46
+ class Clicker extends Component {
48
47
  render() {
49
- return <div onClick={e=>this.props.actions.hogeClick()}>{this.props.hoge.value}</div>;
48
+ return <div onClick={e=>this.props.actions.clickerClick()}>{this.props.clicker.value}</div>;
50
49
  }
51
50
  }
52
51
  function mapStateToProps(state) {
53
- return {hoge:state.hoge};
52
+ return {clicker:state.clicker};
54
53
  }
55
54
  function mapDispatchToProps(dispatch) {
56
55
  return {
57
- actions: bindActionCreators(Object.assign({}, HogeActions), dispatch)
56
+ actions: bindActionCreators(Object.assign({}, ClickerActions), dispatch)
58
57
  };
59
58
  }
60
59
 
61
- export default connect(mapStateToProps)(Hoge);
60
+ export default connect(mapStateToProps, mapDispatchToProps)(Clicker);
62
61
  ```
63
62
 
64
- この状態で<Hoge>を複数箇所に使用したとき、storeにはhogeという入れ物は1つしかないので相互に影響してしまうため、独立したデータで持ちたい。
63
+ この状態で<Clicker>を複数箇所に使用したとき、storeにはclickerという入れ物は1つしかないので相互に影響してしまうため、独立したデータで持ちたい。
65
64
 
66
65
  ```JavaScript
67
- class A extends Component {
66
+ class Hoge extends Component {
68
67
  render() {
68
+ return (
69
+ <div>
70
+ <div>
71
+ <h1>Clicker 1</h1>
72
+ <Clicker/>
73
+ </div>
74
+ <div>
69
- return <div><Hoge/><div>;
75
+ <h1>Clicker 2</h1>
76
+ <Clicker/>
77
+ </div>
78
+ <div>;
70
79
  }
71
80
  }
72
81
  ```
73
- ```JavaScript
74
- class B extends Component {
75
- render() {
76
- return <div><Hoge/><div>;
77
- }
78
- }
79
- ```
80
- Aの中のHogeをHoge1、Bの中のHogeをHoge2としたとき、Hoge1、Hoge2で独立したデータを持てるようにしたいです。Hoge1で発生したactionはHoge1にのみ影響を与えるようにしたいです。いまのままだとHoge1が書き換わるとHoge2も同時に書き換わってしまいます。そもそもreducerがhogeという共通のものを使ってしまう以上、store内に保存されるデータを別々にすることは出来ないのでしょうか?
82
+ このように複数箇所で使用した場合、Clicker 1とClicker 2で独立したデータを持てるようにしたいです。Clicker 1で発生したactionはClicker 1にのみ影響を与えるようにしたいです。いまのままだとClicker 1が書き換わるとClicker 2も同時に書き換わってしまいます。そもそもreducerがclickerという共通のものを使ってしまう以上、store内に保存されるデータを別々にすることは出来ないのでしょうか?
81
83
 
82
84
  ### 試したこと
83
85
 

4

修正。

2018/03/23 06:22

投稿

masaya_ohashi
masaya_ohashi

スコア9210

title CHANGED
File without changes
body CHANGED
@@ -7,20 +7,29 @@
7
7
 
8
8
  ### 該当のソースコード
9
9
 
10
+ 例として、Clickするたびにカウントが1増える<Hoge>というComponentを作ります。
11
+
10
12
  ```JavaScript
11
- // components/Hoge.js
13
+ // actions/hoge.js
12
- class Hoge extends Component {
14
+ function hogeClick() {
13
- // 省略
15
+ return {type:'hoge.click'};
14
16
  }
15
- function mapStateToProps(state) {
17
+ const HogeActions = {
16
- return state;
18
+ hogeClick
17
- }
19
+ };
18
- export default connect(mapStateToProps)(Hoge);
20
+ export default HogeActions;
19
21
  ```
20
22
  ```JavaScript
21
23
  // reducers/hoge.js
24
+ const initialState = {value:0}
25
+ function hoge(state=initialState, action) {
22
- function hoge() {
26
+ switch(action.type) {
23
- // 省略
27
+ case 'hoge.click':
28
+ let ret = Object.assign({}, state);
29
+ ret.value++;
30
+ return ret;
31
+ }
32
+ return state;
24
33
  }
25
34
  ```
26
35
  ```JavaScript
@@ -33,6 +42,25 @@
33
42
  export default mainApp;
34
43
  ```
35
44
 
45
+ ```JavaScript
46
+ // components/Hoge.js
47
+ class Hoge extends Component {
48
+ render() {
49
+ return <div onClick={e=>this.props.actions.hogeClick()}>{this.props.hoge.value}</div>;
50
+ }
51
+ }
52
+ function mapStateToProps(state) {
53
+ return {hoge:state.hoge};
54
+ }
55
+ function mapDispatchToProps(dispatch) {
56
+ return {
57
+ actions: bindActionCreators(Object.assign({}, HogeActions), dispatch)
58
+ };
59
+ }
60
+
61
+ export default connect(mapStateToProps)(Hoge);
62
+ ```
63
+
36
64
  この状態で<Hoge>を複数箇所に使用したとき、storeにはhogeという入れ物は1つしかないので相互に影響してしまうため、独立したデータで持ちたい。
37
65
 
38
66
  ```JavaScript

3

追記修正。

2018/03/23 06:14

投稿

masaya_ohashi
masaya_ohashi

スコア9210

title CHANGED
File without changes
body CHANGED
@@ -49,7 +49,7 @@
49
49
  }
50
50
  }
51
51
  ```
52
- ABの中でそれぞれ<Hoge>使用したA側のHogeがなんらかの契機actionを発すると、B側も同じstoreを参照しているため書き換わってしまうのをうにかしたいです。
52
+ Aの中のHogeをHoge1、Bの中HogeをHoge2としたときHoge1、Hoge2独立したデータ持てるようにしたいです。Hoge1で生したactionはHoge1にのみ影響を与えるようにしたいで。いまのままだとHoge1が書き換わるとHoge2も同時に書き換わってしまいます。そもそもreducerがhogeとい共通もの使ってしま以上、store内保存されるデータを別々にすることは出来なしょうか?
53
53
 
54
54
  ### 試したこと
55
55
 

2

追記

2018/03/23 06:02

投稿

masaya_ohashi
masaya_ohashi

スコア9210

title CHANGED
File without changes
body CHANGED
@@ -35,6 +35,22 @@
35
35
 
36
36
  この状態で<Hoge>を複数箇所に使用したとき、storeにはhogeという入れ物は1つしかないので相互に影響してしまうため、独立したデータで持ちたい。
37
37
 
38
+ ```JavaScript
39
+ class A extends Component {
40
+ render() {
41
+ return <div><Hoge/><div>;
42
+ }
43
+ }
44
+ ```
45
+ ```JavaScript
46
+ class B extends Component {
47
+ render() {
48
+ return <div><Hoge/><div>;
49
+ }
50
+ }
51
+ ```
52
+ AとBの中でそれぞれ<Hoge>を使用した際、A側のHogeがなんらかの契機でactionを発行すると、B側も同じstoreを参照しているため書き換わってしまうのをどうにかしたいです。
53
+
38
54
  ### 試したこと
39
55
 
40
56
  いろいろ調べようとしているのですが、どういう用語で調べたものかわからず、なかなか情報に行き当たりません…

1

reducersのfunction名が誤っていたため修正。

2018/03/23 05:58

投稿

masaya_ohashi
masaya_ohashi

スコア9210

title CHANGED
File without changes
body CHANGED
@@ -19,7 +19,7 @@
19
19
  ```
20
20
  ```JavaScript
21
21
  // reducers/hoge.js
22
- function proc() {
22
+ function hoge() {
23
23
  // 省略
24
24
  }
25
25
  ```