[解決済み] ReactコンポーネントでonClickは動作するが、onDoubleClickは無視される
2022-02-10 02:40:03
質問
Reactでマインスイーパーのゲームを作っているのですが、セルがシングルまたはダブルクリックされたときに別のアクションを実行したいのです。 現在
onDoubleClick
関数は決して起動しません。
onClick
が表示されます。 を削除すると
onClick
ハンドラを使用します。
onDoubleClick
が動作します。 なぜ両方のイベントが動作しないのでしょうか? 1つの要素に両方のイベントを持たせることは可能ですか?
/** @jsx React.DOM */
var Mine = React.createClass({
render: function(){
return (
<div className="mineBox" id={this.props.id} onDoubleClick={this.props.onDoubleClick} onClick={this.props.onClick}></div>
)
}
});
var MineRow = React.createClass({
render: function(){
var width = this.props.width,
row = [];
for (var i = 0; i < width; i++){
row.push(<Mine id={String(this.props.row + i)} boxClass={this.props.boxClass} onDoubleClick={this.props.onDoubleClick} onClick={this.props.onClick}/>)
}
return (
<div>{row}</div>
)
}
})
var MineSweeper = React.createClass({
handleDoubleClick: function(){
alert('Double Clicked');
},
handleClick: function(){
alert('Single Clicked');
},
render: function(){
var height = this.props.height,
table = [];
for (var i = 0; i < height; i++){
table.push(<MineRow width={this.props.width} row={String.fromCharCode(97 + i)} onDoubleClick={this.handleDoubleClick} onClick={this.handleClick}/>)
}
return (
<div>{table}</div>
)
}
})
var bombs = ['a0', 'b1', 'c2'];
React.renderComponent(<MineSweeper height={5} width={5} bombs={bombs}/>, document.getElementById('content'));
解決方法は?
編集してください。
React 0.15.3では問題ないことがわかりました。
オリジナルです。
React 0.13.3の場合、以下の2つの解決策があります。
1. ref コールバック
ダブルクリックの場合でも、シングルクリックハンドラーは2回(1回ずつ)呼ばれることに注意してください。
const ListItem = React.createClass({
handleClick() {
console.log('single click');
},
handleDoubleClick() {
console.log('double click');
},
refCallback(item) {
if (item) {
item.getDOMNode().ondblclick = this.handleDoubleClick;
}
},
render() {
return (
<div onClick={this.handleClick}
ref={this.refCallback}>
</div>
);
}
});
module.exports = ListItem;
2. ロダッシュデバウンス
を使用した別のソリューションがありました。
lodash
しかし、複雑なため断念しました。この利点は、"click" が一度だけ呼ばれ、"double-click" の場合は全く呼ばれないことでした。
import _ from 'lodash'
const ListItem = React.createClass({
handleClick(e) {
if (!this._delayedClick) {
this._delayedClick = _.debounce(this.doClick, 500);
}
if (this.clickedOnce) {
this._delayedClick.cancel();
this.clickedOnce = false;
console.log('double click');
} else {
this._delayedClick(e);
this.clickedOnce = true;
}
},
doClick(e) {
this.clickedOnce = undefined;
console.log('single click');
},
render() {
return (
<div onClick={this.handleClick}>
</div>
);
}
});
module.exports = ListItem;
石鹸箱の上で
ダブルクリックは簡単に検出できるものではないという考え方はありがたいのですが、良くも悪くもそれが
IS
オペレーティングシステムに広く浸透しているため、ユーザーが理解できるパラダイムが存在するのです。さらに、このパラダイムは、最新のブラウザーでもサポートされています。DOMの仕様から削除されるまでは、Reactは機能的な
onDoubleClick
プロップと並んで
onClick
. そうでないようなのが残念です。
関連
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み】WebpackとBabelで「このファイルタイプを扱うには適切なローダーが必要な場合があります。
-
[解決済み】ETIMEDOUTエラーの対処方法は?
-
[解決済み】 \u003C とは何ですか?
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] React-routerのURLを更新したり、手動で書き込んだりするとうまくいかない
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
-
[解決済み] React jsのonClickはメソッドに値を渡すことができない
-
[解決済み] Reactコンポーネント外でのクリックを検出する
-
[解決済み] react-router - ハンドラコンポーネントにpropsを渡す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】TypeError: $(...).DataTable は関数ではありません。
-
[解決済み】Javascript:getElementById対getElementsById(両方が別のページで動作する)。
-
[解決済み] Uncaught TypeError: 未定義のプロパティ 'top' を読み込めない
-
[解決済み】jquery $.ajaxオブジェクトのresponseJSONプロパティを取得する方法 [重複]。
-
[解決済み】getElementByIdはnullを返す?[クローズド]
-
[解決済み】XMLパースエラー:ルート要素が見つからない コンソールの場所 FF
-
[解決済み】このオブジェクトの "forEach "はなぜ関数でないのですか?
-
[解決済み】react router v^4.0.0 Uncaught TypeError: 未定義のプロパティ'location'を読み取れない
-
[解決済み] Uncaught (in promise) TypeError: フェッチに失敗してCorsエラー