我有一个页面,它有一个子组件(Card(数组。在父级中,我保存有多少张卡片被点击。因此,每张卡片都有一个回调函数,当点击时会更新变量。这还可以,只是我也为每张卡保存在本地状态,无论它们是否被点击(点击时会翻转(。但当我调用回调时,更新本地状态不起作用(或者组件被重置,或者我不知道发生了什么(,但它不会更新本地状态。
父级:
export default function Game() {
const [flipState, setFlipState] = useState(0);
function flipCallback() {
if (flipState == 0) {
setFlipState(1);
} else if (flipState == 1) {
setFlipState(2);
} else if (flipState == 2) {
setFlipState(0);
}
}
let tileOrder = [...Array(36).keys()];
let cards = tileOrder.map((e, i) => (
<Card
key={"card" + i + "-" + e}
iconSet={1}
index={i}
speed={1}
callback={() => {
flipCallback();
}}
state={flipState}
/>
));
return (<div>{cards}</div>);
}
孩子:
export default function Card({ iconSet, index, speed, callback, state }) {
const [isFlipped, setFlipped] = useState(false);
const handleFlip = () => {
if (isFlipped === false && (state === 0 || state === 1)) {
callback();
setFlipped(true);
console.log(isFlipped); // This is false, unless I comment out the callback above
if (state == 2) {
setTimeout(() => {
setFlipped(false);
}, speed * 1000);
}
}
};
const statusUpdate = useCallback(() => {
if (isFlipped && state == 2) {
setTimeout(() => {
setFlipped(false);
callback();
}, speed * 1000);
}
}, [isFlipped, speed, state, callback]);
useEffect(() => {
let isMounted = true;
if (isMounted) {
setCardState(state);
statusUpdate();
}
return () => {
isMounted = false;
};
}, [state, statusUpdate]);
return (
<ReactCardFlip isFlipped={isFlipped} flipDirection="horizontal">
<button onClick={handleFlip}>
Blank
</button>
<button>{index}</button>
</ReactCardFlip>
);
}
当您在child中的handleFlip
fn中调用callback()
时,组件将被重新渲染,并且您再次将isFlipped
初始化为false。所以,你可以做的是把你的子组件当作一个受控组件&从父组件设置子组件的状态(即是否翻转(。所以,本质上,传递子组件是否从父组件翻转过来。