Введение
В этом лабораторном задании мы будем изучать использование хука usePortal в React. Цель этого хука - создать портал, который позволяет отображать дочерние элементы вне родительского компонента. Мы узнаем, как использовать хуки useState(), useCallback() и useEffect() для создания и управления порталом, а также как использовать ReactDOM.createPortal() и ReactDOM.unmountComponentAtNode() для отображения и удаления портала.
Хук React usePortal
В ВМ уже предоставлены
index.htmlиscript.js. В общем, вам нужно только добавить код вscript.jsиstyle.css.
Чтобы создать портал, который отображает дочерние элементы вне родительского компонента, следуйте этим шагам:
- Используйте хук
useState(), чтобы создать переменную состояния, которая хранит функцииrender()иremove()для портала. - Используйте
ReactDOM.createPortal()иReactDOM.unmountComponentAtNode()для создания портала и функции для его удаления. Используйте хукuseCallback(), чтобы обернуть и мемоизировать эти функции какcreatePortal(). - Используйте хук
useEffect(), чтобы вызватьcreatePortal()и обновить переменную состояния каждый раз, когда значениеelменяется. - Наконец, верните функцию
render()переменной состояния.
Вот пример реализации:
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;
};
Чтобы использовать этот хук, создайте компонент, который вызывает usePortal() с желаемым DOM-элементом в качестве аргумента. Затем этот компонент может использовать возвращаемую функцию render() для отображения содержимого в портале:
const App = () => {
const Portal = usePortal(document.querySelector("title"));
return (
<p>
Hello world!
<Portal>Portalized Title</Portal>
</p>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
Пожалуйста, нажмите кнопку "Go Live" в нижнем правом углу, чтобы запустить веб-сервис на порту 8080. Затем вы можете обновить вкладку Web 8080, чтобы просмотреть веб-страницу.
Резюме
Поздравляем! Вы завершили лабораторную работу по хукy React usePortal. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.