02.GIFTプロジェクトの回顧:ページ、コンポーネントの紹介
11922 ワード
期間:22.01.06~22.01.28
名称:GIFT
件名:GIPHY Webサイトのクローン作成と改善
技術:React、Type script、styled-componses、StoryBook、Redux、Webpack
リンク:GIFT配置リンク
ウィキペディア:GIFT Kindhub Weki
チームメンバー:@congaweb、@jkpark104、@sosoYim
🚩 GIPHYの公式Webサイトgiphy.comをクローンし、パフォーマンス、アクセス性、UXの改善、react、styled-componse、typescript、storybookなどの技術を熟知したいと考えています.
プロジェクトの進行中に印象に残ったコンポーネントを紹介しましょう.
各要素を順次描画 動画を一定時間ごとに繰り返し再生
このプロジェクトで使用するframer-motionは、コントロール要素のアニメーションを宣言するライブラリです.Framer motion公式ドキュメントショートカット
SVGアニメーションは不透明またはscaleX、scaleY属性で実現されます.ライブラリで指定したuseAnimation hookを使用して順次再生し、装飾的か有意義かを区別する svg-spriteテクノロジーsvg画像-useプロパティ をレンダリングするデフォルトでは親が満たされています size可変-width,height属性 モノクロで色を変更可能-fillプロパティ を使用
svg-spriteテクノロジーを使用して、propsのコンポーネントとしてuse属性に使用するidを受信します.値をlabel propsに渡すかどうかによって、装飾的な要素として使用したり、意味のある要素として使用したりすることができます.
装飾要素として使用:次の検索ボタンの内部で使用されるアイコンは、検索ラベルが付いているため、装飾要素としてのみ使用されます.
意味のある要素として使用:逆に、「検証済み」の意味を持つバッジ要素はverifiedをlabel propsに渡し、次のタイトルを持つようにします.
必要なタグを指定できる必要があります タグのサブエレメントは画面に表示されませんが、アシストデバイスで を読み込む必要があります.focusの場合、表示 に設定できる必要があります.
デザインでは表示されないタイトルラベルやラベルなどの構成部品に使用されます.styled-componsesなので、どのhtmlタグをpropsとして渡すだけでいいです.エレメントのサブアイテムとして非表示にするエレメントを作成します.
focusの処理は
クエリーを入力するたびに、イベントハンドラは再定義されません.useCallback を使用します.関連クエリーを受信し、推奨する-エスケープ・テクノロジーを使用 同一クエリーの発行時に再登録しない-submitプロセッサによって制御
質問:検索バー(Input)のonBlurイベントでフォーカスが離れた場合、関連する検索語コンポーネントが非表示になります.したがって、関連クエリーをクリックすると、リンクを移動する前にコンポーネントが非表示になり、リンクを移動できません.
悩み:まず考えられる解決策は、関連クエリー領域と他の領域を区別してイベントを処理することです.ただし、区別するためには、イベント処理を最上位のルート要素にアップグレードする必要があります.素子ユニットの開発の観点から,これはあまり適切ではないようだ.
解決策: 「最近」を使用して、フォーカス移動の要素 isOpenをfalseまたは検索バーまたは関連検索に置き換えます. 関連クエリー領域の場合、選択したリンクのテキスト(関連クエリー)を抽出することによって、実際の値Keywordが更新されます. ステータスの変更により再登録され、新しい検索結果が表示されます. インタラクティブ-ウィンドウビューポートの幅に応じて条件付きレンダリング Cimantic構造-Cimanticラベル を使用サブメニューはタイトル上部の真下にあり、位置属性 を使用します.最小再読み込み-タイトル上部のusemo
再読み込みの最小化: 質問:テキストを入力し、画面幅を調整するとすぐに検索を再読み込みし、タイトル上部 を再読み込みします.ソリューション:useMemoを使用して検索バー以外のtop-stext を記憶する
状態に応じて条件付きレンダリングを行い、反作用を実現します. documentのwidth値が既存のismobile状態と一致しない場合の更新状態
(widthがブレークポイントより小さい場合、ismobileはfalse、逆も同様)
@congawebで作成され、コードコメントで作業中の悩みを共有できます.これは単純に見えるTaglitだが,反応の動作原理を知る必要があるタスクである.タスク: 現在のブラウザから出力されているgifの水平長を超えない場合に登録タグリスト 登録されていないタグがある場合は、「その他」(+)ボタン を入力してください.gifの大きさは固定しない tagの文字数に制限はありません 各文字の幅が異なる ソリューション:Layoutとステータス変更を使用して実装 スクリーンに最初に出力されるタグのテキストと、[その他]ボタンをクリックしたときに表示されるテキストを含む配列を選択しました. スクリーンレイアウトを描画してから、上記の条件でどのくらいのTagコンポーネントをレンダリングするかがわかります.useLayoutのレイアウトは測定状態にあるため、必要なタグの長さを計算することができ、塗装前のステップであるため、再アップロード時に点滅せずにアップロードすることができる.
次の章では、GIFTチームがパフォーマンスの最適化とアクセス性の面で行った努力を共有し、まとめを振り返ります.
名称:GIFT
件名:GIPHY Webサイトのクローン作成と改善
技術:React、Type script、styled-componses、StoryBook、Redux、Webpack
リンク:GIFT配置リンク
ウィキペディア:GIFT Kindhub Weki
チームメンバー:@congaweb、@jkpark104、@sosoYim
🚩 GIPHYの公式Webサイトgiphy.comをクローンし、パフォーマンス、アクセス性、UXの改善、react、styled-componse、typescript、storybookなどの技術を熟知したいと考えています.
ページの概要
ホームページ
キー構成部品の概要
プロジェクトの進行中に印象に残ったコンポーネントを紹介しましょう.
ロゴアニメーション
このプロジェクトで使用するframer-motionは、コントロール要素のアニメーションを宣言するライブラリです.Framer motion公式ドキュメントショートカット
SVGアニメーションは不透明またはscaleX、scaleY属性で実現されます.ライブラリで指定したuseAnimation hookを使用して順次再生し、
sequenceAnimation
関数を作成し、実行時にアニメーションを定義および実行します.// useAnimation 훅을 사용하여 컨트롤 객체 생성
const control1 = useAnimation();
const control2 = useAnimation();
function sequenceAnimation() {
// (기타 컨트롤 생략)
// 초기 값 설정
control1.set({ opacity: 0, scale: 0 });
control2.set({ scaleX: 0, x: '-5%' });
// promise를 반환하는 start 메서드를 호출하여 순차적으로 애니메이션을 실행하는 sequences 함수 만들기
const sequences = async () => {
await control1.start({
opacity: 1,
scale: 1,
transition: { duration: 0.2 },
});
await control2.start({ scaleX: 1, x: 0 });
};
sequences();
}
上で定義したuseEffect
をsequenceAnimation
で実行します.次に、setInterval
を使用してタスクを繰り返し実行し、一度実行したスケジューリング関数はclearId
で受信され、削除されます. useEffect(() => {
sequenceAnimation();
const clearId = setInterval(sequenceAnimation, 6000);
return () => clearInterval(clearId);
}, [control1, control2, control3, control4, control5]);
✨ SvgIcon
svg-spriteテクノロジーを使用して、propsのコンポーネントとしてuse属性に使用するidを受信します.値をlabel propsに渡すかどうかによって、装飾的な要素として使用したり、意味のある要素として使用したりすることができます.
装飾要素として使用:次の検索ボタンの内部で使用されるアイコンは、検索ラベルが付いているため、装飾要素としてのみ使用されます.
意味のある要素として使用:逆に、「検証済み」の意味を持つバッジ要素はverifiedをlabel propsに渡し、次のタイトルを持つようにします.
✨ A11yhidden
デザインでは表示されないタイトルラベルやラベルなどの構成部品に使用されます.styled-componsesなので、どのhtmlタグをpropsとして渡すだけでいいです.エレメントのサブアイテムとして非表示にするエレメントを作成します.
overflow: hidden;
position: absolute;
clip: rect(1px 1px 1px 1px);
clip-path: circle(0);
width: 1px;
height: 1px;
margin: -1px;
white-space: nowrap;
A 11 yHidden要素のルート要素には、画面に表示されないように、上記のスタイルが用意されています.focusの処理は
$focasable
propsを受け取り,この値がtrue
である場合にのみ,上記要素の隠蔽に対して逆の処理を行った.検索バー
質問:検索バー(Input)のonBlurイベントでフォーカスが離れた場合、関連する検索語コンポーネントが非表示になります.したがって、関連クエリーをクリックすると、リンクを移動する前にコンポーネントが非表示になり、リンクを移動できません.
悩み:まず考えられる解決策は、関連クエリー領域と他の領域を区別してイベントを処理することです.ただし、区別するためには、イベント処理を最上位のルート要素にアップグレードする必要があります.素子ユニットの開発の観点から,これはあまり適切ではないようだ.
解決策:
:focus
で処理しますが、関連クエリーの処理が追加されました.まず、関連検索語のステータスonBlur
と、現在のページで検索されたキーワードisOpen
が表示されるかどうかを管理します.操作手順は次のとおりです.actualKeyword
「ローカルエリアネットワークツリー」に特定のクラスが含まれているかどうかを決定します定規
再読み込みの最小化:
状態に応じて条件付きレンダリングを行い、反作用を実現します.
relatedTarget
現在のモバイル版とデスクトップ版のどちらを管理(widthがブレークポイントより小さい場合、ismobileはfalse、逆も同様)
✨ Taglist
@congawebで作成され、コードコメントで作業中の悩みを共有できます.これは単純に見えるTaglitだが,反応の動作原理を知る必要があるタスクである.
の最後の部分
次の章では、GIFTチームがパフォーマンスの最適化とアクセス性の面で行った努力を共有し、まとめを振り返ります.
Reference
この問題について(02.GIFTプロジェクトの回顧:ページ、コンポーネントの紹介), 我々は、より多くの情報をここで見つけました https://velog.io/@sosoyim/02.-GIFT-프로젝트-회고テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol