質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1664閲覧

Reactで、マウスでドロップする際にも、onClickが発火してしまう

action_moto

総合スコア8

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2019/11/17 05:55

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
reactで、react-rndを使用し、マウスでカードをドラッグアンドロップで移動と、クリックにてモーダルが開く仕組みを作ろうとしています。

発生している問題

クリックで、モーダルは開きますが、マウスでドロップする際にも、モーダルが開いていしまいます。

該当のソースコード

react

1 2handelModal = (e) => { 3 this.setState({ 4 showModal: !showModal, 5 }) 6 } 7 8render() { 9return( 10<Rnd 11 position={{ x: this.state.x, y: this.state.y }} 12 onDragStop={(e, d) => { this.setState({ x: d.x, y: d.y }) }} 13 onClick={(e) => { 14 this.handelModal(e) 15 e.preventdefault() 16 e.stopPropagation() 17 }} 18> 19 001 20</Rnd>);

試したこと

上記のように、e.preventdefault(),e.stopPropagation()を入れてみましたが、うまくいきません。
react-rndに関して調べてみましたが、exmapleの数が少なく、ほぼ英語なので応えまでたどり着きせんでした。 よろしくお願いします。

補足情報(FW/ツールのバージョンなど)

react-rnd: https://github.com/bokuweb/react-rnd

"react-rnd": "^9.0.4",

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは

react-rnd の下記 issue

に投稿されている、この回答 を参考に、以下を作成しました。

jsx

1import React, { Component } from "react"; 2import { render } from "react-dom"; 3import { Rnd } from "react-rnd"; 4import Modal from "react-modal"; 5import "./modal.css"; 6 7const rndStyle = { 8 display: "flex", 9 alignItems: "center", 10 justifyContent: "center", 11 border: "solid 1px #ddd", 12 background: "#f0f0f0" 13}; 14 15class App extends Component { 16 constructor(props) { 17 super(props); 18 this.state = { showModal: false, dragging: false }; 19 } 20 21 handelModal = () => { 22 const { showModal } = this.state; 23 this.setState({ 24 showModal: !showModal 25 }); 26 }; 27 28 onLocationClick = () => { 29 console.log(this.state); 30 if (this.state.dragging) return; 31 this.handelModal(); 32 }; 33 34 onBoxDragStop = () => { 35 const that = this; 36 setTimeout(function() { 37 that.setState({ dragging: false }); 38 }, 500); 39 }; 40 41 onBoxDrag = () => { 42 this.setState({ dragging: true }); 43 }; 44 45 componentDidMount() { 46 Modal.setAppElement("body"); 47 } 48 49 render() { 50 return ( 51 <React.Fragment> 52 <Modal 53 isOpen={this.state.showModal} 54 className="Modal" 55 overlayClassName="Overlay" 56 onRequestClose={this.handelModal} 57 > 58 Modal 59 </Modal> 60 <Rnd 61 style={rndStyle} 62 default={{ 63 x: 0, 64 y: 0, 65 width: 320, 66 height: 200 67 }} 68 onDragStop={this.onBoxDragStop} 69 onDrag={this.onBoxDrag} 70 > 71 <div 72 style={{ 73 height: "100%", 74 width: "100%", 75 textAlign: "center", 76 paddingTop: 150, 77 fontSize: 24 78 }} 79 onClick={this.onLocationClick} 80 > 81 react-rnd 82 </div> 83 </Rnd> 84 </React.Fragment> 85 ); 86 } 87} 88 89render(<App />, document.getElementById("root")); 90

上記のコードを以下にて動作確認することができます。

これは、react-rnd のサンプル をベースとして、ドラッグ対象のエリアをクリックすると、 react-modal によるモーダルが表示されるようにしたものです。モーダルを消去するには、モーダルの外側をクリックするか、ESCキーを押します。

以上、参考になれば幸いです。

投稿2019/11/17 16:20

編集2019/11/17 17:29
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

action_moto

2019/11/18 05:34 編集

丁寧で、的確な回答ありがとうございます!! 次回の際は、なるべくコード全体を載せるよう気をつけたいと思います。 if (this.state.dragging) return;を挿入することで、ドラッグしていない間(this.state.dragging:false)だけクリックすればモーダルが開くようにしているが、 しかしそれだけだとドラッグをやめた際にも、this.state.dragging:falseの状態なのでモーダルが開いてしまう。そこで、setTimeoutでthis.state.dragging:trueをしばらく維持することで、モーダルが開かない仕組みになっているんですね! if (this.state.dragging) return;の理解も甘かったので、とても勉強になりました。 ありがとうございました!
jun68ykt

2019/11/18 06:58

どういたしまして! > ・・・仕組みになっているんですね! はい、そうです。setTimeoutでちょっと時間をおくところなどはトリッキーですが、理解できてしまえば、なかなか上手い手だなと、しっくりきますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問