Kouzlo..
Pro tuto událost jsme uvedli MediaQueryListEvent
a dostaneme zpět objekt, který vypadá nějak takto.
MediaQueryListEvent : {
isTrusted: true,
media: "(min-width: 768px)",
matches: true,
...
}
Hledáme, zda z dotazu získáme shodu, a pokud ano, chceme jednat.
Nastavíme stavovou proměnnou mQuery
pomocí useState
a inicializoval jej získáním aktuálního okna innerWidth.
const [mQuery, setMQuery] = React.useState<any>({
matches: window.innerWidth > 768 ? true : false,
});
V naší komponentě budeme naslouchat této události z window
objekt voláním window.matchMedia
useEffect(() => {
let mediaQuery = window.matchMedia("(min-width: 768px)");
mediaQuery.addListener(setMQuery);
// this is the cleanup function to remove the listener
return () => mediaQuery.removeListener(setMQuery);
}, []);
addListener
volá naši funkci setState, aby podržela výsledky, a změna stavové proměnné způsobí, že se komponenta znovu vykreslí.
Na základě stavové proměnné vykreslíme nabídku hamburgerů nebo seznam tlačítek, která odpovídají položkám boční nabídky
Úplný zdroj pro NavButtons
komponent
// NavButtons.tsx
export const NavButtons = () => {
const [mQuery, setMQuery] = React.useState<any>({
matches: window.innerWidth > 768 ? true : false,
});
useEffect(() => {
let mediaQuery = window.matchMedia("(min-width: 768px)");
mediaQuery.addListener(setMQuery);
// this is the cleanup function to remove the listener
return () => mediaQuery.removeListener(setMQuery);
}, []);
// MediaQueryListEvent { isTrusted: true, media: "(min-width: 768px)", matches: true ...}
return (
<div>
{mQuery && !mQuery.matches ? (
<IonMenuButton />
) : (
<>
<IonButton routerLink={"/home"}>Home </IonButton>
<IonButton routerLink={"/page-1"}>One </IonButton>
<IonButton routerLink={"/page-2"}>Two</IonButton>
</>
)}
</div>
);
};
Pak použijeme komponentu v IonToolbar
našich stránek, viz příklad níže
// Home.tsx
const Home: React.FC = () => {
return (
<IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>HOME</IonTitle>
<IonButtons slot="end">
<NavButtons/> // <== OUR COMPONENT
</IonButtons>
</IonToolbar>
</IonHeader>
<IonContent fullscreen>
</IonContent>
</IonPage>
);
};
export default Home;
Úplný zdrojový kód projektu na GitHubu
aaronksaunders / sidemenu-topnav-ionic-react
Ionic Horizontal &Side Menu Navigation v ReactJS
Ionic Horizontal &Side Menu Navigation v ReactJS
Podívejte se na úplné vysvětlení a příspěvek na blogu na dev.to
https://dev.to/aaronksaunders/ionic-horizontal-sidemenu-navigation-in-reactjs-2ko6
Horizontální a boční navigace v nabídce Ionic Framework v aplikaci ReactJS https://youtu.be/S7whj93SGsA přes @YouTube
Zobrazit na GitHubu