解决方案
我尝试在每次点击按钮时增加计数。当点击按钮时,它会被渲染两次。但是应该只渲染一次。
这是我的代码https://codesandbox.io/s/async-pine-3z2ty3?file=/src/App.jsimport { useCallback, useMemo, useState } from "react";
import Button from "./Button";
export default function App() {
const [count, setCount] = useState(0);
const [count1, setCount1] = useState(0);
const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]);
const MyButton1 = useMemo(
() => <Button handleClick={handleClick} title="Increment Count" />,
[handleClick]
);
const MyButton2 = useMemo(
() => (
<Button handleClick={() => setCount1(count1 + 1)} title="Click here" />
),
[count1]
);
return (
<div className="App">
<div>count : {count}</div>
{MyButton1}
<div>count1 : {count1}</div>
{MyButton2}
</div>
);
}
import React from "react";
const Button = React.memo(({ handleClick, title }) => {
console.log(title);
return <button onClick={handleClick}>{title}</button>;
});
export default Button;
问题
- 您的
handleClick
函数改变了count
- 如果
count
变化,则创建新的handleClick
- 如果
handleClick
更改,则创建新的<Button>
解决方案- 删除多余的
useMemo
s - 传递一个函数给
setCount
- 删除
useCallback
的依赖项
export default function App() {
const [count, setCount] = useState(0);
const [count1, setCount1] = useState(0);
const handleClick = useCallback(() => {
setCount((count) => count + 1);
}, []);
return (
<div className="App">
<div>count : {count}</div>
<Button handleClick={handleClick} title="Increment Count" />
</div>
);
}
useMemo
ssetCount
useCallback
的依赖项export default function App() {
const [count, setCount] = useState(0);
const [count1, setCount1] = useState(0);
const handleClick = useCallback(() => {
setCount((count) => count + 1);
}, []);
return (
<div className="App">
<div>count : {count}</div>
<Button handleClick={handleClick} title="Increment Count" />
</div>
);
}
现在你的组件将开始渲染一次,再也不渲染了
如果你想有两个按钮,你必须有两个回调
export default function App() {
const [count, setCount] = useState(0);
const [count1, setCount1] = useState(0);
const handleClick = useCallback(() => {
setCount((count) => count + 1);
}, []);
const handleClick1 = useCallback(() => {
setCount1((count) => count + 1);
}, []);
return (
<div className="App">
<div>count : {count}</div>
<Button handleClick={handleClick} title="Increment Count" />
<div>count : {count}</div>
<Button handleClick={handleClick1} title="Click here" />
</div>
);
}
沙箱
从index.js文件中删除<StrictMode></StrictMode>