Um dos segredos para construir aplicativos React de alto desempenho é evitar novas renderizações desnecessárias. O mecanismo de renderização do React é eficiente, mas ainda é crucial evitar novas renderizações onde elas não são necessárias. Nesta postagem, abordaremos erros comuns e como evitá-los.
A memorização ajuda você a pular novas renderizações quando os adereços do componente não foram alterados. No entanto, é fácil usar mal o React.memo ao não implementar uma função de comparação personalizada.
const MemoizedComponent = React.memo(MyComponent);
Isso apenas verifica se a referência dos adereços foi alterada, o que pode nem sempre ser suficiente.
const MemoizedComponent = React.memo(MyComponent, (prevProps, nextProps) => { return prevProps.itemId === nextProps.itemId; });
Aqui, usamos uma função de comparação personalizada que só aciona uma nova renderização quando a propriedade itemId muda.
O uso de funções inline dentro do JSX pode levar a novas renderizações desnecessárias, pois o React trata uma nova função como um novo suporte em cada renderização.
function ButtonComponent() { return ; }
Isso faz com que o handleClick seja recriado em cada renderização, levando a novas renderizações desnecessárias.
import { useCallback } from 'react'; function ButtonComponent() { const handleClick = useCallback(() => { // Handle click logic }, []); return ; }
Ao usar useCallback, memorizamos a função handleClick, evitando recriações desnecessárias em cada renderização.
Ao trabalhar com componentes de classe, usar React.PureComponent garante que o componente seja renderizado novamente se seus adereços ou estado mudarem. Se você estiver usando React.Component, isso pode levar a novas renderizações desnecessárias.
class CardComponent extends React.Component { // Component logic }
class CardComponent extends React.PureComponent { // Component logic }
Ao estender React.PureComponent, o React comparará superficialmente adereços e estados, evitando novas renderizações desnecessárias.
Ao usar useSelector do react-redux, é importante selecionar apenas a fatia necessária do estado.
import { useSelector } from 'react-redux'; const DataComponent = () => { const globalState = useSelector((state) => state); // Render logic };
Isso fará com que o componente seja renderizado novamente sempre que qualquer parte do estado for alterada.
import { useSelector } from 'react-redux'; const DataComponent = () => { const selectedData = useSelector((state) => state.specificSlice); // Render logic based on specific slice };
Ao selecionar apenas a parte necessária do estado, você minimiza as novas renderizações.
Para componentes de classe que não estendem PureComponent, a implementação manual de shouldComponentUpdate permite um controle mais granular sobre quando o componente é renderizado novamente.
class ListItem extends React.Component { // Component logic }
Isso será renderizado novamente toda vez que o componente pai for renderizado, mesmo que os adereços e o estado não tenham mudado.
class ListItem extends React.Component { shouldComponentUpdate(nextProps, nextState) { return this.props.itemId !== nextProps.itemId || this.state.value !== nextState.value; } // Component logic }
Ao personalizar o shouldComponentUpdate, garantimos que o componente só será renderizado novamente quando a propriedade itemId ou o estado do valor for alterado.
Ao empregar essas técnicas, você pode reduzir significativamente re-renderizações desnecessárias em seus aplicativos React, levando a um melhor desempenho. Implementar memoização com React.memo, aproveitar PureComponent e ajustar o shouldComponentUpdate são estratégias importantes para otimizar seus componentes React.
Compreender quando e como otimizar a renderização pode melhorar muito a experiência do usuário, fornecendo aplicativos mais rápidos e responsivos.
Se você achou este guia útil, considere compartilhá-lo com outras pessoas! ?
Este blog fornece uma visão geral atualizada e abrangente sobre como evitar novas renderizações desnecessárias em aplicativos React, ao mesmo tempo que incorpora práticas recomendadas e altera nomes de variáveis para maior clareza e relevância nas práticas modernas de desenvolvimento web.
Citações:
[1] https://www.geeksforgeeks.org/what-is-memoization-in-react/
[2] https://stackoverflow.com/questions/74013864/why-arent-all-react-components-wrapped-with-react-memo-by-default
[3] https://www.syncfusion.com/blogs/post/what-is-memoization-in-react
[4] https://hygraph.com/blog/react-memo
[5] https://refine.dev/blog/react-memo-guide/
[6] https://dmitripavlutin.com/use-react-memo-wisely/
[7] https://www.topcoder.com/thrive/articles/memoization-in-react-js
[8] https://react.dev/reference/react/memo
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3