【发布时间】:2021-08-29 22:28:36
【问题描述】:
这是一个父组件(Cart)和一个子组件(CartItem)。
在父级中,有一个button,它依赖于通过道具传递给子级的checkAvailability函数改变的状态,
import {useState} from "react";
import CartItem from "./CartItem";
const Cart = ({cart}) => {
const [available, setAvailable] = useState(true);
const checkAvailability = (check) => {
setAvailable(check)
}
return (
<>
{cart.items.map((item) => (
item.is_valid &&
<CartItem
key={item.id}
checkAvailability={checkAvailability}
/>
))}
<button disabled={available} >Click Me!</button>
</>
)
}
export default Cart;
在 child 组件中,API 调用 返回由useEffect 调用的true or false。
import {useState, useEffect} from "react";
const CartItem = ({checkAvailability}) => {
const [newData, setNewData] = useState(null);
const handleCheck = async () => {
const data = await api.call();
setNewData(data)
if(newData.available === false) {
checkAvailability(false)
} else if(newData.available === true) {
checkAvailability(true)
}
};
useEffect(() => {
handleCheck();
}, []);
return (
<div> Item </div>
)
};
export default CartItem;
问题:
每次挂载组件时,子组件中的 API 调用都会返回一个值,该值通过 checkAvailability 函数作为道具传递给父组件,这会更改父组件中的状态,当状态更改时 重新渲染发生,无限重启循环。
- 主要是当 API 调用返回 {false} 值时按钮被禁用。如果这种方式不起作用,还有其他方法吗?
解决办法是什么?
【问题讨论】:
-
我认为这里的问题是您没有为要映射的购物车项目指定任何 React 键。尝试添加每个购物车项目固有的键,例如
item.id。 -
@DrewReese 在原始代码中,它们存在。为了简化代码,我决定不写它们。
-
您能否更新您的问题以包含所有相关代码?它应该是一个Minimal, Complete, and Reproducible Code Example,足以让我们自己充分和(可能很容易地)复制。
Cart组件是否因某种原因重新安装?我看不出为什么CartItem组件会重新挂载。 -
您是否尝试将 checkAvilability 添加为 useEffect 的依赖项?
-
你应该在父组件中有api调用。为什么是子组件?
标签: javascript reactjs