检测函数是否在 React 中的另一个组件上运行
Detect If Function Runs on Another Component in React
我需要检测 handleSelectProduct
是否在另一个组件中被调用。
我的问题是,如果我希望子组件 (ProductDetailsComponent) 重新呈现,它仍会输出 console.log('HELO')
。我只想输出 console.log('HELO')
IF handleSelectProduct
is being click only.
const ProductComponent = () => {
const [triggered, setTriggered] = React.useState(0);
const handleSelectProduct = (event) => {
setTriggered(c => c + 1);
};
return (
<div>
Parent
<button type="button" onClick={handleSelectProduct}>
Trigger?
</button>
<ProductDetailsComponent triggered={triggered} />
</div>
);
};
const ProductDetailsComponent = ({ triggered }) => {
React.useEffect(() => {
if (triggered) {
console.log('HELO');
}
}, [triggered]);
return <div>Child</div>;
};
ReactDOM.render(
<ProductComponent />,
document.getElementById("root")
);
我觉得最简单的解决方案是使用 useRef
来保留旧值,因此仅当触发值发生变化时才考虑 console.log
。
const ProductDetailsComponent = ({ triggered }) => {
const oldTriggerRef = React.useRef(0);
React.useEffect(() => {
if (triggered !== oldTriggerRef.current) {
oldTriggerRef.current = triggered;
console.log('HELO');
}
}, [triggered]);
return <div>Child</div>;
};
我需要检测 handleSelectProduct
是否在另一个组件中被调用。
我的问题是,如果我希望子组件 (ProductDetailsComponent) 重新呈现,它仍会输出 console.log('HELO')
。我只想输出 console.log('HELO')
IF handleSelectProduct
is being click only.
const ProductComponent = () => {
const [triggered, setTriggered] = React.useState(0);
const handleSelectProduct = (event) => {
setTriggered(c => c + 1);
};
return (
<div>
Parent
<button type="button" onClick={handleSelectProduct}>
Trigger?
</button>
<ProductDetailsComponent triggered={triggered} />
</div>
);
};
const ProductDetailsComponent = ({ triggered }) => {
React.useEffect(() => {
if (triggered) {
console.log('HELO');
}
}, [triggered]);
return <div>Child</div>;
};
ReactDOM.render(
<ProductComponent />,
document.getElementById("root")
);
我觉得最简单的解决方案是使用 useRef
来保留旧值,因此仅当触发值发生变化时才考虑 console.log
。
const ProductDetailsComponent = ({ triggered }) => {
const oldTriggerRef = React.useRef(0);
React.useEffect(() => {
if (triggered !== oldTriggerRef.current) {
oldTriggerRef.current = triggered;
console.log('HELO');
}
}, [triggered]);
return <div>Child</div>;
};