はじめに
この実験では、React における useMediaQuery フックの使用方法を探ります。このフックを使うと、現在の環境が指定されたメディアクエリに一致するかどうかを確認し、適切な値を返すことができます。画面サイズに応じて動作を変える応答型コンポーネントを作成するために、このフックをどのように使うか学びます。
React useMediaQuery フック
VM には既に
index.htmlとscript.jsが用意されています。一般的には、script.jsとstyle.cssにのみコードを追加すればよいです。
この関数は、現在の環境が指定されたメディアクエリに一致するかどうかを確認し、適切な値を返します。
- まず、
WindowとWindow.matchMedia()が存在するかどうかを確認します。存在しない場合(例えば SSR 環境やサポートされていないブラウザの場合)、whenFalseを返します。 Window.matchMedia()を使って指定されたqueryと一致させます。そのmatchesプロパティをブール値にキャストし、useState()フックを使って状態変数matchに格納します。useEffect()フックを使って変更のリスナーを追加し、フックが破棄された後にリスナーをクリーンアップします。- 最後に、
matchの値に基づいてwhenTrueまたはwhenFalseを返します。
const useMediaQuery = (query, whenTrue, whenFalse) => {
if (
typeof window === "undefined" ||
typeof window.matchMedia === "undefined"
) {
return whenFalse;
}
const mediaQuery = window.matchMedia(query);
const [match, setMatch] = React.useState(!!mediaQuery.matches);
React.useEffect(() => {
const handler = () => setMatch(!!mediaQuery.matches);
mediaQuery.addListener(handler);
return () => mediaQuery.removeListener(handler);
}, [mediaQuery]);
return match ? whenTrue : whenFalse;
};
const ResponsiveText = () => {
const text = useMediaQuery(
"(max-width: 400px)",
"Less than 400px wide",
"More than 400px wide"
);
return <span>{text}</span>;
};
ReactDOM.createRoot(document.getElementById("root")).render(<ResponsiveText />);
右下隅の「Go Live」をクリックして、ポート 8080 でウェブサービスを実行してください。その後、Web 8080 タブを更新してウェブページをプレビューできます。
まとめ
おめでとうございます!あなたは React useMediaQuery フックの実験を完了しました。あなたの技術を向上させるために、LabEx でさらに多くの実験を行って練習してください。