Closed4

useInViewの返り値について

hoshitahoshita

react-intersection-observerのuseInViewの返り値についてまとめた

react-intersection-observerとは、要素がviewport内に表示されたり表示されなくなったことを通知してくれるパッケージである

https://github.com/thebuilder/react-intersection-observer

ドキュメントのuserInViewところから引用する

// Use object destructuring, so you don't need to remember the exact order
const { ref, inView, entry } = useInView(options);

// Or array destructuring, making it easy to customize the field names
const [ref, inView, entry] = useInView(options);

上記のように返り値は配列orオブジェクト。

その返り値について型がこちら

node_modules/react-intersection-observer/index.d.ts
export declare type InViewHookResponse = [
    (node?: Element | null) => void,
    boolean,
    IntersectionObserverEntry | undefined
] & {
    ref: (node?: Element | null) => void;
    inView: boolean;
    entry?: IntersectionObserverEntry;
};
hoshitahoshita

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

オブジェクトで受け取る場合は、ref,inVIew,entryという名前で受け取る必要がある。
もし、そこから名前を変えたい場合は:のあとに変数名を指定すると、その名前を変数として使用できる。

  const { ref, inView, entry }  = useInView(options);

  const {
    ref: buttonRef,
    inView: buttonInView,
    entry: buttonEntry,
  } = useInView(options);

配列の場合は、受け取る値に直接任意の名前を与えることができる。

const [buttonRef, buttonInView, buttonEntry] = useInView(options);

ドキュメントに書いてあるように、オブジェクトであれば正確な順番を覚える必要がなく、配列であれば名前の変更が容易。

hoshitahoshita

refだけを使用したい場合、オブジェクトか配列どちらで取得した方が読みやすいか比較する

const { ref }  = useInView(options);

const [ref] = useInView(options);

1番目のrefであれば大差なさそう。

ただ同じファイル内でuseInVIewを複数回使う場合は、それぞれに変数名を与えないと名前重複でエラーが発生する。

その場合は変数名を設定しやすい配列の方が良さそう。

hoshitahoshita

2番目のInViewを使用したい場合

const { inView }  = useInView(options);

const [, inView] = useInView(options);

3番目のentryを使用したい場合

const { entry }  = useInView(options);

const [, , entry] = useInView(options);

オブジェクトで受け取った方が直感的で読みやすいと感じた。

ケースとしてrefを使わない場面は少ない気がするが、もし1番目の要素を使用しないならオブジェクトで受け取る方が良さそう。

このスクラップは2024/05/01にクローズされました