Introdução
Neste laboratório, exploraremos o uso do hook usePortal em React. O propósito deste hook é criar um portal que permite a renderização de filhos fora do componente pai. Aprenderemos como usar os hooks useState(), useCallback() e useEffect() para criar e gerenciar um portal, bem como como usar ReactDOM.createPortal() e ReactDOM.unmountComponentAtNode() para renderizar e remover o portal.
React usePortal Hook
index.htmlescript.jsjá foram fornecidos na VM. Em geral, você só precisa adicionar código ascript.jsestyle.css.
Para criar um portal que renderiza filhos fora do componente pai, siga estes passos:
- Use o hook
useState()para criar uma variável de estado que armazena as funçõesrender()eremove()para o portal. - Use
ReactDOM.createPortal()eReactDOM.unmountComponentAtNode()para criar um portal e uma função para removê-lo. Use o hookuseCallback()para encapsular e memorizar essas funções comocreatePortal(). - Use o hook
useEffect()para chamarcreatePortal()e atualizar a variável de estado sempre que o valor deelmudar. - Finalmente, retorne a função
render()da variável de estado.
Aqui está um exemplo de implementação:
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;
};
Para usar este hook, crie um componente que chama usePortal() com o elemento DOM desejado como argumento. Este componente pode então usar a função render() retornada para renderizar conteúdo no portal:
const App = () => {
const Portal = usePortal(document.querySelector("title"));
return (
<p>
Hello world!
<Portal>Portalized Title</Portal>
</p>
);
};
ReactDOM.createRoot(document.getElementById("root")).render(<App />);
Por favor, clique em 'Go Live' no canto inferior direito para executar o serviço web na porta 8080. Em seguida, você pode atualizar a aba Web 8080 para visualizar a página web.
Resumo
Parabéns! Você concluiu o laboratório React usePortal Hook. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.