[解決済み] react useEffect オブジェクトの比較
2022-11-24 17:01:28
質問
reactを使用しています。
useEffect
フックを使い、オブジェクトが変更されたかどうかをチェックし、その後フックを再度実行しています。
私のコードは以下のようなものです。
const useExample = (apiOptions) => {
const [data, updateData] = useState([]);
useEffect(() => {
const [data, updateData] = useState<any>([]);
doSomethingCool(apiOptions).then(res => {
updateData(response.data);
})
}, [apiOptions]);
return {
data
};
};
残念ながら、オブジェクトが同一であると認識されないため、実行され続けています。
以下のような例だと思います。
const objA = {
method: 'GET'
}
const objB = {
method: 'GET'
}
console.log(objA === objB)
おそらく
JSON.stringify(apiOptions)
が効いているのでは?
どのように解決するのですか?
使用方法
apiOptions
を状態値として使用します。
カスタムフックをどのように消費しているのか分かりませんが、このように
apiOptions
を使って状態の値として
useState
を使えばうまくいくはずです。このようにして、カスタムフックにステート値として提供することができます。
const [apiOptions, setApiOptions] = useState({ a: 1 })
const { data } = useExample(apiOptions)
こうすることで、あなたが
setApiOptions
.
例1
import { useState, useEffect } from 'react';
const useExample = (apiOptions) => {
const [data, updateData] = useState([]);
useEffect(() => {
console.log('effect triggered')
}, [apiOptions]);
return {
data
};
}
export default function App() {
const [apiOptions, setApiOptions] = useState({ a: 1 })
const { data } = useExample(apiOptions);
const [somethingElse, setSomethingElse] = useState('default state')
return <div>
<button onClick={() => { setApiOptions({ a: 1 }) }}>change apiOptions</button>
<button onClick={() => { setSomethingElse('state') }}>
change something else to force rerender
</button>
</div>;
}
または
深い比較対象を書くこともできます
useEffect
というように
ここで
:
function deepCompareEquals(a, b){
// TODO: implement deep comparison here
// something like lodash
// return _.isEqual(a, b);
}
function useDeepCompareMemoize(value) {
const ref = useRef()
// it can be done by using useMemo as well
// but useRef is rather cleaner and easier
if (!deepCompareEquals(value, ref.current)) {
ref.current = value
}
return ref.current
}
function useDeepCompareEffect(callback, dependencies) {
useEffect(
callback,
dependencies.map(useDeepCompareMemoize)
)
}
のように使うことができます。
useEffect
.
関連
-
[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
-
[解決済み] HTML5のlocalStorageにオブジェクトを格納する方法は?
-
[解決済み] Reactルータを使ったプログラムによるナビゲーション
-
[解決済み] JavaScriptのオブジェクトの配列からidでオブジェクトを検索する
-
[解決済み] オブジェクトをメンバーとして、プレーンなJavaScriptオブジェクトをループさせる方法
-
[解決済み] React JSX内のループ
-
[解決済み] Reactのこの3つの点は何をするところなのでしょうか?
-
[解決済み] useEffect React Hook使用時の依存性欠如の警告を修正する方法
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み] useEffectの無限ループ
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 2つのJavaScriptオブジェクトの等質性を判断する方法は?
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] ECMAScriptとは?
-
[解決済み] モデルフェッチ時に1をtrueに、0をfalseに変換する方法
-
[解決済み] Node.jsのES6クラスをrequireで作る
-
[解決済み] HTML要素にスクロールバーがあるかどうかをチェックする
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
-
[解決済み] JavaScriptの文字列プリミティブとStringオブジェクトの違いは何ですか?