[解決済み] componentDidUpdate()の内部で setState()する。
2022-04-28 14:32:31
質問
ドロップダウンの高さと画面上の入力の位置に応じて、ドロップダウンを入力の下または上に移動させるスクリプトを書いています。また、その方向に応じてドロップダウンにモディファイアを設定したいです。
しかし
setState
の内部で
componentDidUpdate
無限ループになります(当たり前ですが)
を使用することで解決しました。
getDOMNode
とクラス名を直接ドロップダウンに設定しますが、私はReactツールを使用してより良いソリューションがあるはずだと感じています。どなたか助けていただけませんか?
以下は、動作中のコードの一部です。
getDOMNode
(i
コードを簡単にするために、位置決めロジックを少し無視しました)
let SearchDropdown = React.createClass({
componentDidUpdate(params) {
let el = this.getDOMNode();
el.classList.remove('dropDown-top');
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
el.classList.add('dropDown-top');
}
},
render() {
let dataFeed = this.props.dataFeed;
return (
<DropDown >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
そして、以下は setstate を使ったコードです(無限ループになります)。
let SearchDropdown = React.createClass({
getInitialState() {
return {
top: false
};
},
componentDidUpdate(params) {
let el = this.getDOMNode();
if (this.state.top) {
this.setState({top: false});
}
if(needToMoveOnTop(el)) {
el.top = newTopValue;
el.right = newRightValue;
if (!this.state.top) {
this.setState({top: true});
}
}
},
render() {
let dataFeed = this.props.dataFeed;
let class = cx({'dropDown-top' : this.state.top});
return (
<DropDown className={class} >
{dataFeed.map((data, i) => {
return (<DropDownRow key={response.symbol} data={data}/>);
})}
</DropDown>
);
}
});
解決方法は?
を使用することができます。
setState
内部
componentDidUpdate
. 問題は、ブレーク条件がないため、なぜか無限ループを作っていることです。
コンポーネントがレンダリングされると、ブラウザから提供される値が必要になるという事実に基づけば、あなたのアプローチでは
componentDidUpdate
のトリガーとなる条件をうまく処理する必要があるだけです。
setState
.
関連
-
Vue Element-uiは、アイコンを追加するためのツリーコントロールノードを詳細に実装しています。
-
Vue+ElementUIによる大規模なフォームの処理例
-
vue for 登録ページ効果 vue for sms 認証コードログイン
-
[解決済み】GETできない / Nodejsエラー
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] React JSX内のループ
-
[解決済み] setStateを呼び出さずにReactコンポーネントを強制的に再レンダリングすることは可能ですか?
-
[解決済み] React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】ReactJS - "setState "が呼ばれるたびにrenderが呼び出されるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
vueディレクティブv-bindの使用と注意点
-
Vueのフォームイベントのデータバインディングの説明
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】リソースの読み込みに失敗した:Bind関数でサーバーが500(Internal Server Error)のステータスで応答した【非公開
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み】リクエストに失敗していないのに、「TypeError: failed to fetch」が表示される。
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
OSSアップロードエラーを解決する: net::ERR_SSL_PROTOCOL_ERROR