回答編集履歴

5

ついき

2018/07/03 14:06

投稿

HayatoKamono
HayatoKamono

スコア2415

test CHANGED
@@ -215,3 +215,35 @@
215
215
 
216
216
 
217
217
  [=> Demo](https://codesandbox.io/s/641l14jmlr)
218
+
219
+
220
+
221
+
222
+
223
+ # 追記
224
+
225
+ ```
226
+
227
+ import throttle from 'lodash.throttle';
228
+
229
+
230
+
231
+ //(中略)
232
+
233
+
234
+
235
+ handleScroll = throttle((event) => {
236
+
237
+ this.setState({
238
+
239
+ scrollTop: this.node.scrollTop
240
+
241
+ })
242
+
243
+ }, 100)
244
+
245
+ ```
246
+
247
+
248
+
249
+ scrollする度に処理を走らせてしまうのはパフォーマンス的にしんどいので、100ミリ秒毎に処理を走らせるように`lodash`の`throttle`で`scroll`イベントを間引きました。

4

throttleを追加

2018/07/03 14:06

投稿

HayatoKamono
HayatoKamono

スコア2415

test CHANGED
@@ -20,6 +20,8 @@
20
20
 
21
21
  import ReactDOM from "react-dom";
22
22
 
23
+ import throttle from 'lodash.throttle';
24
+
23
25
 
24
26
 
25
27
  class App extends Component {
@@ -34,7 +36,7 @@
34
36
 
35
37
 
36
38
 
37
- handleScroll = (event) => {
39
+ handleScroll = throttle((event) => {
38
40
 
39
41
  this.setState({
40
42
 
@@ -42,7 +44,7 @@
42
44
 
43
45
  })
44
46
 
45
- }
47
+ }, 100)
46
48
 
47
49
 
48
50
 
@@ -118,6 +120,8 @@
118
120
 
119
121
  import ReactDOM from "react-dom";
120
122
 
123
+ import throttle from 'lodash.throttle';
124
+
121
125
 
122
126
 
123
127
  class App extends Component {
@@ -142,15 +146,15 @@
142
146
 
143
147
 
144
148
 
145
- handleScroll = (event) => {
149
+ handleScroll = throttle((event) => {
146
150
 
147
151
  this.setState({
148
152
 
149
- scrollTop: this.node.current.scrollTop
153
+ scrollTop: this.node.scrollTop
150
154
 
151
155
  })
152
156
 
153
- }
157
+ }, 100)
154
158
 
155
159
 
156
160
 
@@ -204,6 +208,8 @@
204
208
 
205
209
  ReactDOM.render(<App />, rootElement);
206
210
 
211
+
212
+
207
213
  ```
208
214
 
209
215
 

3

a

2018/07/03 14:03

投稿

HayatoKamono
HayatoKamono

スコア2415

test CHANGED
@@ -1,3 +1,9 @@
1
+ # 回答
2
+
3
+ 雑な書き捨てコードですが、こんな感じで出来ます。
4
+
5
+
6
+
1
7
  # キャプチャー画像(animation Gif)
2
8
 
3
9
  ![イメージ説明](b99554161f0ee4a45f262740d256018c.gif)

2

a

2018/07/03 13:41

投稿

HayatoKamono
HayatoKamono

スコア2415

test CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
 
8
8
 
9
- # コード
9
+ # コード(React 16.3以前)
10
10
 
11
11
  ```ここに言語を入力
12
12
 
@@ -97,3 +97,109 @@
97
97
 
98
98
 
99
99
  [=> Demo](https://codesandbox.io/s/40wxzzv1y7)
100
+
101
+
102
+
103
+
104
+
105
+ # コード(React 16.3以降)
106
+
107
+
108
+
109
+ ```
110
+
111
+ import React, { Component } from "react";
112
+
113
+ import ReactDOM from "react-dom";
114
+
115
+
116
+
117
+ class App extends Component {
118
+
119
+
120
+
121
+ constructor(props) {
122
+
123
+ super(props);
124
+
125
+ this.node = React.createRef();
126
+
127
+ }
128
+
129
+
130
+
131
+ state = {
132
+
133
+ scrollTop: 0
134
+
135
+ }
136
+
137
+
138
+
139
+ handleScroll = (event) => {
140
+
141
+ this.setState({
142
+
143
+ scrollTop: this.node.current.scrollTop
144
+
145
+ })
146
+
147
+ }
148
+
149
+
150
+
151
+ render() {
152
+
153
+ return (
154
+
155
+ <div>
156
+
157
+
158
+
159
+ <div
160
+
161
+ style={{
162
+
163
+ overflowY: 'scroll',
164
+
165
+ height: '50px',
166
+
167
+ backgroundColor: '#ccc'
168
+
169
+ }}
170
+
171
+ onScroll={this.handleScroll}
172
+
173
+ ref={this.node}
174
+
175
+ >
176
+
177
+ <p style={{ fontSize: '50px' }}>Hello World</p>
178
+
179
+ </div>
180
+
181
+
182
+
183
+ <p>Scroll Top: {this.state.scrollTop}</p>
184
+
185
+
186
+
187
+ </div>
188
+
189
+ );
190
+
191
+ }
192
+
193
+ }
194
+
195
+
196
+
197
+ const rootElement = document.getElementById("root");
198
+
199
+ ReactDOM.render(<App />, rootElement);
200
+
201
+ ```
202
+
203
+
204
+
205
+ [=> Demo](https://codesandbox.io/s/641l14jmlr)

1

https://teratail.storage.googleapis.com/uploads/contributed_images/b99554161f0ee4a45f262740d256018c.

2018/07/03 13:38

投稿

HayatoKamono
HayatoKamono

スコア2415

test CHANGED
@@ -1,6 +1,12 @@
1
+ # キャプチャー画像(animation Gif)
2
+
1
3
  ![イメージ説明](b99554161f0ee4a45f262740d256018c.gif)
2
4
 
5
+ [=> animation Gif](https://teratail.storage.googleapis.com/uploads/contributed_images/b99554161f0ee4a45f262740d256018c.gif)
3
6
 
7
+
8
+
9
+ # コード
4
10
 
5
11
  ```ここに言語を入力
6
12
 
@@ -90,4 +96,4 @@
90
96
 
91
97
 
92
98
 
93
- [https://codesandbox.io/s/40wxzzv1y7](https://codesandbox.io/s/40wxzzv1y7)
99
+ [=> Demo](https://codesandbox.io/s/40wxzzv1y7)