Eu tenho App.js que se parece com isto:
import ChildComponent from "./ChildComponent";
import { useState, useMemo, useCallback } from "react";
export default function App() {
const [pageTitle, setPageTitle] = useState("");
const [anotherProp, setAnotherProp] = useState(1);
const handleInputChange = useCallback(
(e) => {
setPageTitle(e.target.value);
},
[pageTitle]
);
const handleIncrement = useCallback(() => {
setAnotherProp(anotherProp + 1);
}, [anotherProp]);
return (
<div className="App">
<ChildComponent title={pageTitle} handleInputChange={handleInputChange} />
<div>
{anotherProp}
<input
type={"button"}
value={"Increment Count"}
onClick={handleIncrement}
/>
</div>
</div>
);
}
O componente filho se parece com isto:
function ChildComponent({ title, handleInputChange }) {
console.log("Child Component renders");
return (
<>
<input type="text" onChange={handleInputChange} />
<h1>{title}</h1>
</>
);
}
export default ChildComponent;
Desde que usei, useCallBack
espero que, ao clicar no botão para aumentar a contagem, meu componente filho permaneça inalterado e não seja renderizado novamente. Mas meu componente filho ainda é renderizado novamente.
Você pode me ajudar a entender por quê?
Esse é o comportamento padrão do React. Ele renderizará novamente seus filhos quando o componente pai for renderizado novamente, mesmo que os adereços do filho não tenham mudado. Nesse caso, seu pai está renderizando novamente à medida que seu estado é atualizado (o
anotherProp
contador).Se você quiser evitar que um componente específico seja renderizado novamente quando seus adereços permanecerem inalterados, você pode usar
React.memo()
envolvendo-oChildComponent
nele, por exemplo:Com isso, o React não renderizará novamente
ChildComponent
quando seus adereços permanecerem inalterados.Por outro lado, a
[pageTitle]
dependência do seu primeirouseCallback()
gancho é desnecessária e pode ser apenas[]
porque o seu retorno de chamada não usa esse valor de estado dentro dele.Outra versão da resposta. Combinação de useCallback e useMemo
Aplicativo.js
Criança.js
Espero que isto ajude.
O problema está na matriz de dependência em useCallback para handleInputChange. Você tem pageTitle como uma dependência, o que faz com que a função handleInputChange seja recriada sempre que pageTitle for alterado. Portanto, remova pageTitle da matriz de dependências para evitar recriações desnecessárias e deve funcionar conforme o esperado.