[TIL][UFO]-無限スクロールアプリケーション
😓 無限スクロール
フリー掲示板ページ
デザイナーと初期プロジェクトを設計する場合は、フリー掲示板でページ移動をページ名に設定します.デザイン上デスクトップ上の掲示板リストページが少し空いている可能性があるため、UI要素を加えて解決することをお勧めする人が多い.
では、なぜ無限スクロールを適用するのでしょうか。
プロジェクトの開始に輪角があり、配布のためにバージョン1を作成し、ユーザーのフィードバックを得ることにしました.
フェイスブック広告を利用して海外大学在学中の留学生に宣伝し、グーグル分析を利用してサービス利用データを収集する.
結果はわれわれの予想とは違う😧
初期、ユーザーである留学生がどのような機械で私たちのサービスを利用するかを考えたとき、彼らは大学生だったので、より多くのユーザーがデスクトップを使用することを期待していました.
しかしGoogleの分析で確認した結果、モバイルサービスを利用する人はモバイルサービスを利用する人の2.5倍であり、実際のフィードバックでは、モバイル環境でサービスを利用するのは不便だという意見が寄せられた.
ある意味では当たり前の結果です.モバイルユーザのために反応型viewを作成したが,前述したように,大きさが小さく反応型が大きくなるだけで,モバイルユーザの立場では当然不便を感じる.
私たちは直接モバイルでサービスをテストして、ページ名のボタンをクリックしたり、投稿を書くために執筆ボタンをクリックしたりして、モバイルでは本当に不便です.
🏋️ Challenge
この問題を解決するために、モバイル環境では無限スクロールページが適用され、投稿がロードされます.
(機能の実装が完了したら、本当に文章を書きたいかもしれませんが、これは簡単すぎるようですが...これは本当に難しいです.)
1.無限スクロールの作成
無限スクロールを作成する方法は、10個のしきい値が見つかった場合、10個とも異なる方法で実現されるため、実現方法を決定するのに多くの時間がかかります.
まず、IntersectionObserverAPIを使用する方法を考えます。
IntersectionObserverとはMDNドキュメントに記載されているものです.
IntersectionObserver(クロスオブザーバAPI)は、ターゲット層とターゲット層の親層または親層のビューポートが交差する箇所を非同期で観察するAPIである.
に表示されます.
簡単に言えば、Intersection Observerは、画面(ビューポート)に私が指定したターゲット要素があるかどうかを観察するAPIです.
Intersection Observerを適用して無限スクロールを行う場合は、viewportの画面に表示される特定のターゲット要素useref()で観察し、サーバに投稿をロードして投稿リストに追加すればよい.
特に、無限スクロールを実現する際、window volwlを使用する場合、不要なリクエストを減らすためにdebonse、throttleを使用することができます.
スクロールイベントでは、現在の高さの値を知るために、レイアウトが毎回再描画され、正しい値が得られます.
上記の資料から分かるように、レイアウトを再描画することはレンダリングツリーを再生成することを意味し、この一連の「再ストリーム」と呼ばれるプロセスを繰り返すと、ブラウザのパフォーマンスが低下し、画面が混乱するのは当然です.
2つ目の考え方は、何度も実装された無限スクロール素子を作成し、情報を含む素子を包むことである。
Intersection Observerを使用する方法も魅力的だと思いますが、機能を素早く実現して再配置する必要がある場合なので、従来通り行うことにしましたが、Intersection Observer APIは今後の個人プロジェクトで取り扱うことになります.
const InfinityScroll = props => {
const { nextCall, children, is_loading, is_next, size } = props;
const throttle = _.throttle(() => {
let scrollHeight = document.documentElement.scrollHeight;
let innerHeight = window.innerHeight;
let scrollTop =
(document.documentElement && document.documentElement.scrollTop) ||
document.body.scrollTop;
let current_height = scrollHeight - innerHeight - scrollTop;
if (current_height < size) {
if (is_loading) {
return;
}
nextCall();
}
}, size);
const throttle_callback = useCallback(throttle, [is_loading]);
useEffect(() => {
if (is_loading) {
return;
}
if (is_next) {
window.addEventListener("scroll", throttle_callback);
} else {
window.removeEventListener("scroll", throttle_callback);
}
return () => window.removeEventListener("scroll", throttle_callback);
}, [is_loading, is_next]);
return <>{children}</>;
};
無限スクロール素子です.この素子は5つのpropsを転送して使用することができる.is loading値により、非同期要求が進行中の場合にnextCallが再実行できないことが管理されます.
is nextは、次の投稿ページが存在するかどうかを確認する値です.
sizeは、ロードする投稿の数を指定する値です.
フリー掲示板ページに無限スクロールを適用するコードです。
<InfinityScroll
nextCall={nextCall}
is_next={nextPage <= totalPage ? true : false}
size={100}
is_loading={is_Loading}
>
<BoardBox
postList={freeBoardPostList && freeBoardPostList}
preview={true}
boardName="freeboard"
/>
</InfinityScroll>
Reference
この問題について([TIL][UFO]-無限スクロールアプリケーション), 我々は、より多くの情報をここで見つけました https://velog.io/@heesungj7/passport-로그인-회원가입テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol