ReactJs。ボタンが何度も押されないようにする
2023-11-12 16:39:17
質問
私のReactコンポーネントでは、クリックされたときにAJAXを介していくつかのデータを送信するためのボタンがあります。私は最初の1回だけ起こる必要があります、すなわち、その最初の使用の後にボタンを無効にすることです。
どのように私はこれをしようとしています。
var UploadArea = React.createClass({
getInitialState() {
return {
showUploadButton: true
};
},
disableUploadButton(callback) {
this.setState({ showUploadButton: false }, callback);
},
// This was simpler before I started trying everything I could think of
onClickUploadFile() {
if (!this.state.showUploadButton) {
return;
}
this.disableUploadButton(function() {
$.ajax({
[...]
});
});
},
render() {
var uploadButton;
if (this.state.showUploadButton) {
uploadButton = (
<button onClick={this.onClickUploadFile}>Send</button>
);
}
return (
<div>
{uploadButton}
</div>
);
}
});
私が思うに、何が起こるかというと、状態変数
showUploadButton
がすぐに更新されないことだと思います。Reactのドキュメントによると、これは期待されていることです。
どのようにしたら、ボタンがクリックされた瞬間に無効になったり、完全に消えたりするように強制することができますか?
どのように解決するのですか?
ボタンがクリックされたら無効になるようにし、ページ内に残す(クリックできない要素にする)ことができます。
これを達成するためには、ボタン要素にrefを追加する必要があります。
<button ref="btn" onClick={this.onClickUploadFile}>Send</button>
そして、onClickUploadFile関数でボタンを無効にします。
this.refs.btn.setAttribute("disabled", "disabled");
無効化されたボタンには、次のようなスタイルでユーザーにフィードバックを与えることができます。
.btn:disabled{ /* styles go here */}
必要に応じて
this.refs.btn.removeAttribute("disabled");
更新しました。 Reactでrefを処理する好ましい方法は、文字列ではなく、関数である。
<button
ref={btn => { this.btn = btn; }}
onClick={this.onClickUploadFile}
>Send</button>
this.btn.setAttribute("disabled", "disabled");
this.btn.removeAttribute("disabled");
更新しました。 react hooksの使用
import {useRef} from 'react';
let btnRef = useRef();
const onBtnClick = e => {
if(btnRef.current){
btnRef.current.setAttribute("disabled", "disabled");
}
}
<button ref={btnRef} onClick={onBtnClick}>Send</button>
あなたが提供したコードを使った小さな例です。 https://jsfiddle.net/69z2wepo/30824/
関連
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] テキストボックスのEnterキーで、JavaScriptでボタンクリックをトリガーする
-
[解決済み] JavaScriptで複数の値を返す?
-
[解決済み] jQueryの送信ボタンの無効化・有効化
-
[解決済み] ReactJSでコンポーネントがtext型の非制御入力を制御エラーに変更する場合
-
[解決済み] ReactJS Componentに複数のクラスを追加する方法は?
-
[解決済み] Enterキーが押されたときにフォームを送信しないようにする
-
[解決済み】ReactJS - "setState "が呼ばれるたびにrenderが呼び出されるのですか?
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Angularjs - 現在の日付を表示する
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] サブドメインにまたがってlocalStorageを使用する
-
[解決済み] Chromeの拡張機能開発にWebStormを使用するにはどうすればよいですか?
-
[解決済み] JavaScript のオブジェクトの配列を比較し、最小値/最大値を取得する
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] リダイレクトされずにHTMLフォームを送信する方法