Einführung
In diesem Lab werden wir die Verwendung des usePortal-Hooks in React untersuchen. Der Zweck dieses Hooks ist es, einen Portal zu erstellen, der das Rendern von Kindern außerhalb der Elternkomponente ermöglicht. Wir werden lernen, wie die Hooks useState(), useCallback() und useEffect() verwendet werden, um ein Portal zu erstellen und zu verwalten, sowie wie ReactDOM.createPortal() und ReactDOM.unmountComponentAtNode() verwendet werden, um das Portal zu rendern und zu entfernen.
React usePortal-Hook
index.htmlundscript.jswurden bereits in der VM bereitgestellt. Im Allgemeinen müssen Sie nur Code inscript.jsundstyle.csshinzufügen.
Um ein Portal zu erstellen, das Kinder außerhalb der Elternkomponente rendert, folgen Sie diesen Schritten:
- Verwenden Sie den
useState()-Hook, um eine Zustandsvariable zu erstellen, die dierender()- undremove()-Funktionen für das Portal enthält. - Verwenden Sie
ReactDOM.createPortal()undReactDOM.unmountComponentAtNode(), um ein Portal und eine Funktion zum Entfernen davon zu erstellen. Verwenden Sie denuseCallback()-Hook, um diese Funktionen alscreatePortal()zu umschließen und zu memoize. - Verwenden Sie den
useEffect()-Hook, umcreatePortal()aufzurufen und die Zustandsvariable jedes Mal zu aktualisieren, wenn sich der Wert voneländert. - Schließlich geben Sie die
render()-Funktion der Zustandsvariable zurück.
Hier ist eine Beispielimplementierung:
const usePortal = (el) => {
const [portal, setPortal] = React.useState({
render: () => null,
remove: () => null
});
const createPortal = React.useCallback((el) => {
const Portal = ({ children }) => ReactDOM.createPortal(children, el);
const remove = () => ReactDOM.unmountComponentAtNode(el);
return { render: Portal, remove };
}, []);
React.useEffect(() => {
if (el) portal.remove();
const newPortal = createPortal(el);
setPortal(newPortal);
return () => newPortal.remove(el);
}, [el]);
return portal.render;
};
Um diesen Hook zu verwenden, erstellen Sie eine Komponente, die usePortal() mit dem gewünschten DOM-Element als Argument aufruft. Diese Komponente kann dann die zurückgegebene render()-Funktion verwenden, um Inhalte im Portal zu rendern:
const App = () => {
const Portal = usePortal(document.querySelector("title"));
return (
<p>
Hello world!
<Portal>Portalized Title</Portal>
</p>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
Bitte klicken Sie auf 'Go Live' in der unteren rechten Ecke, um den Webdienst auf Port 8080 auszuführen. Anschließend können Sie die Registerkarte Web 8080 aktualisieren, um die Webseite anzuschauen.
Zusammenfassung
Herzlichen Glückwunsch! Sie haben das React usePortal-Hook-Lab abgeschlossen. Sie können in LabEx weitere Labs ausprobieren, um Ihre Fähigkeiten zu verbessern.