javascript - 检测函数是否在 React 的另一个组件中被调用
问题描述
我调用handleSelectProduct
了这个函数ProductComponent
,我想在ProductDetailsComponent
. 如果handleSelectProduct
被调用,那么我想在使用ProductComponent
中运行某个函数。ProductDetailsComponent
useEffect
产品组件
const ProductComponent = () => {
const [selectedProduct, setProduct] = useState(null);
const handleSelectProduct = (event) => {
setProduct(event.target.value);
};
return (
<div>
<Select
value={selectedProduct}
onChange={(e) => handleSelectProduct(e)}
>
{(products || []).map(({ id, name }) => (
<MenuItem value={id}>{name}</MenuItem>
))}
</Select>
<ProductDetailsComponent handleSelectProduct={handleSelectProduct} />
</div>
);
};
export default ProductComponent;
产品详情组件
const ProductDetailsComponent = ({ handleSelectProduct }) => {
useEffect(() => {
handleSelectProduct ? formik.setFieldValue("productInfo", "") : null;
}, [handleSelectProduct]);
};
export default ProductDetailsComponent;
解决方案
如果
handleSelectProduct
被调用ProductComponent
,那么我想运行某个函数ProductDetailsComponent
我不认为这正是你真正想要的。如果组件耦合得那么紧密,你应该只使用一个组件。ProductDetailsComponent
行为应该只取决于它的 props 和它的内部状态。
ProductDetailsComponent
您真正想要的是在所选产品发生变化时调用某个函数。正如您已经注意到的那样,您可以使用useEffect
- 但将产品作为依赖项来做到这一点。您只需将selectedProduct
作为道具传递给组件而不是handleSelectProduct
函数。
const ProductComponent = () => {
const [selectedProduct, setProduct] = useState(null);
return (
…
<ProductDetailsComponent selectedProduct={selectedProduct} />
);
};
const ProductDetailsComponent = ({ selectedProduct }) => {
useEffect(() => {
if (selectedProduct) formik.setFieldValue("productInfo", "");
}, [selectedProduct]);
};
推荐阅读
- aop - AspectJ 在具有匹配参数值的注释上定义切入点
- java - 要求在多线程环境中明确 TransformerFactory 的 XSLT Transformer
- ubuntu - 如何修复 Nexus 403 禁止问题
- c - 抽象结构数组
- javascript - 根据对象名称过滤对象数组
- dynamics-crm - 如何仅使用原始 TSQL 而不是 Web API 和组织服务来查询 CRM 动态实体?
- here-api - HERE Destination Weather API:我可以使用 lat/lon 代替名称吗?
- javascript - 将零移到数组的末尾并保留非零元素而不改变顺序
- ruby-on-rails - 设置 Webpacker 模块选项
- c# - 在具有定义区域的网格上确定 Point3d 的位置