回答編集履歴

2

コンポーネントのアンマウント時にイベントハンドラーを削除するコードを追記しました。

2019/06/26 06:42

投稿

KuwabataK
KuwabataK

スコア306

test CHANGED
@@ -56,21 +56,21 @@
56
56
 
57
57
  this.groups = [
58
58
 
59
- { id: 1, title: 'group 1' }, { id: 2, title: 'group 2' }, { id: 3, title: 'group 3' },
59
+ { id: 1, title: 'group 1' }, { id: 2, title: 'group 2' }, { id: 3, title: 'group 3' },
60
60
 
61
- { id: 4, title: 'group 4' }, { id: 5, title: 'group 5' }, { id: 6, title: 'group 6' },
61
+ { id: 4, title: 'group 4' }, { id: 5, title: 'group 5' }, { id: 6, title: 'group 6' },
62
62
 
63
- ];
63
+ ];
64
64
 
65
-
65
+
66
66
 
67
67
  this.items = [
68
68
 
69
- {id: 1, group: 1, title: 'item 1', start_time: moment(), end_time: moment().add(1, 'hour')},
69
+ { id: 1, group: 1, title: 'item 1', start_time: moment(), end_time: moment().add(1, 'hour') },
70
70
 
71
- {id: 2, group: 2, title: 'item 2', start_time: moment().add(-0.5, 'hour'),end_time: moment().add(0.5, 'hour')},
71
+ { id: 2, group: 2, title: 'item 2', start_time: moment().add(-0.5, 'hour'), end_time: moment().add(0.5, 'hour') },
72
72
 
73
- {id: 3, group: 1, title: 'item 3', start_time: moment().add(2, 'hour'), end_time: moment().add(3, 'hour')}
73
+ { id: 3, group: 1, title: 'item 3', start_time: moment().add(2, 'hour'), end_time: moment().add(3, 'hour') }
74
74
 
75
75
  ]
76
76
 
@@ -80,7 +80,7 @@
80
80
 
81
81
  this.myRef = React.createRef();
82
82
 
83
-
83
+
84
84
 
85
85
  }
86
86
 
@@ -90,39 +90,53 @@
90
90
 
91
91
  // Didmount後にリスナーを登録
92
92
 
93
- this.myRef.current.addEventListener('touchstart', (e)=>{
94
-
95
- if (e.touches.length >= 2){
96
-
97
- e.preventDefault()
98
-
99
- }
100
-
101
- },{passive:false}) // {passive: false}を指定しないとe.preventDefault()は有効になってくれない
93
+ this.myRef.current.addEventListener('touchstart', this.handleDisablePinchIn, { passive: false }) // {passive: false}を指定しないとe.preventDefault()は有効になってくれない
102
94
 
103
95
  }
104
96
 
105
97
 
106
98
 
99
+ componentWillUnmount() {
100
+
101
+ // unmount前にリスナーを削除
102
+
103
+ this.myRef.current.removeEventListener('touchstart', this.handleDisablePinchIn, { passive: false })
104
+
105
+ }
106
+
107
+
108
+
109
+ handleDisablePinchIn(e) {
110
+
111
+ if (e.touches.length >= 2) {
112
+
113
+ e.preventDefault()
114
+
115
+ }
116
+
117
+ }
118
+
119
+
120
+
107
- render(){
121
+ render() {
108
122
 
109
123
  return <div>
110
124
 
111
- <div ref={this.myRef}>
125
+ <div ref={this.myRef}>
112
126
 
113
- <Timeline
127
+ <Timeline
114
128
 
115
- groups={this.groups}
129
+ groups={this.groups}
116
130
 
117
- items={this.items}
131
+ items={this.items}
118
132
 
119
- defaultTimeStart={moment().add(-12, 'hour')}
133
+ defaultTimeStart={moment().add(-12, 'hour')}
120
134
 
121
- defaultTimeEnd={moment().add(12, 'hour')}
135
+ defaultTimeEnd={moment().add(12, 'hour')}
122
136
 
123
- />
137
+ />
124
138
 
125
- </div>
139
+ </div>
126
140
 
127
141
  </div>
128
142
 
@@ -134,4 +148,6 @@
134
148
 
135
149
  export default App;
136
150
 
151
+
152
+
137
153
  ```

1

githubへのリンクを追加

2019/06/26 06:41

投稿

KuwabataK
KuwabataK

スコア306

test CHANGED
@@ -6,13 +6,25 @@
6
6
 
7
7
 
8
8
 
9
- というわけで、もしもReactで対象のElement内だけでピンチイン/アウトを禁止したい場合は、以下のURLを参考にイベントリスナを登録してやればいけると思います
9
+ というわけで、もしもReactで対象のElement内だけでピンチイン/アウトを禁止したい場合は、以下のURLを参考にイベントリスナを登録してやればいけると思います
10
10
 
11
11
  [Ref と DOM](https://ja.reactjs.org/docs/refs-and-the-dom.html)
12
12
 
13
13
 
14
14
 
15
+ ただ、refを使ってリスナを登録すること自体、Reactではあまりやりたくないことだと思うので、もう少し良いやり方があるのかもしれません。
16
+
17
+
18
+
19
+ 一応サンプルコードを載せておきます。
20
+
15
- 私の環境だと、以下のようなコードを書けばうまく意図した動きになってくれました
21
+ 私の環境だと、以下のようなコードを書けばうまく意図した動きになってくれました
22
+
23
+
24
+
25
+ ついでにGitHubにサンプルプロジェクトを作ったので、必要であれば参考にしてください
26
+
27
+ https://github.com/kuwabataK/react-disable-pinch-in-sample
16
28
 
17
29
 
18
30