1 回答
TA贡献1846条经验 获得超7个赞
来自 React 组件文档
如果您想在 prop 更改时“重置”某些状态,请考虑......用键完全不受控制。
在要重置为初始状态的组件上使用反应键。
当第一个更新时,您可以将其用作要重置的countOne
第二个的密钥。提供作为第二个的初始值。删除重复的状态,因为它是不必要的。并使回调可选,但将新的状态值传递给回调,即,或使用效果来处理它,否则状态值将不同步。Counter
Counter
countOne % 2
Counter
countTwo
handleChange
count + counter
function Counter({ initialCount, handleChange }) {
const [count, setCount] = React.useState(initialCount);
const handleClick = (counter) => {
setCount(count + counter);
handleChange && handleChange(count + counter);
};
// or
useEffect(() => {
handleChange && handleChange(count);
}, [count, handleChange]);
const handleClick = (counter) => {
setCount(count + counter);
};
return (
<>
<h1>Counter {count}</h1>
<button
type="button"
onClick={() => handleClick(1)}
style={{ marginRight: "8px" }}
>
Add
</button>
<button type="button" onClick={() => handleClick(-1)}>
Subtract
</button>
</>
);
}
export default function App() {
const [countOne, setCountOne] = React.useState(1);
return (
<div className="App">
<Counter
initialCount={countOne}
handleChange={setCountOne}
/>
<Counter
key={countOne}
initialCount={countOne % 2}
/>
</div>
);
}
如果您不想使用反应键来重置为初始状态,那么您可以提供另一个道具作为第二个useEffect钩子中的依赖项以重置为提供的initialValue道具。
function Counter2({ initialCount, handleChange, reset }) {
const [count, setCount] = React.useState(initialCount);
useEffect(() => {
handleChange && handleChange(count);
}, [count, handleChange]);
useEffect(() => {
setCount(initialCount);
}, [reset, initialCount]);
const handleClick = (counter) => {
setCount(count + counter);
};
return (
<>
<h1>Counter 2: {count}</h1>
<button
type="button"
onClick={() => handleClick(1)}
style={{ marginRight: "8px" }}
>
Add
</button>
<button type="button" onClick={() => handleClick(-1)}>
Subtract
</button>
</>
);
}
传递countOne给reset道具,以便在更新时重置计数countOne。
<Counter2 reset={countOne} initialCount={countOne % 2} />
添加回答
举报