这是我目前的代码
class cart extends Component {
state = { loading: [] };
addToCart = (e, id) => {
let loading = this.state.loading.slice();
loading[e] = true;
this.setState({
loading,
})
};
render() {
const { data } = this.props;
return (
<div>
{data.map(catering => {
const { menus } = catering;
return (
<Row>
{menus.map(menu => (
<Col xs={12} md={12} lg={6} key={menu.id} className="m-bottom-15">
<Card style={{ height: '165px', border: 0, overflow: 'hidden' }}>
<CardActions>
<LoadingButton
className="button small primary pull-right"
loading={thi.state.loading || false}
onClick={e => this.addToCart(e, menu.id)}
>
<MdAdd size={18} color={white} />
<span className="font-14 font-400">Add to cart</span>
</LoadingButton>
</CardActions>
</Card>
</Col>
))}
</Row>
);
}
}
map
功能完成后,将有大约20个按钮。
我想要达到的目标是:每次用户点击add to cart
按钮,我都会调用ajax来保存购物车并显示特定点击按钮的加载。
完成ajax后,将状态恢复正常。
在我目前的代码中,我还没有拨打我的ajax电话,我仍然想确保按下加载按钮。现在它不起作用。
我怎样才能做到这一点?
感谢。
答案 0 :(得分:1)
addToCart方法中存在一些错误。您应该使用id作为加载索引并将加载数组设置为以下状态:
addToCart = (e, id) => {
let loading = this.state.loading.slice();
loading[id] = true;
this.setState({
loading: loading
});
};
另外,在你的render方法中,将this.state.loading更改为this.state.loading [menu.id]:
<LoadingButton
className="button small primary pull-right"
loading={this.state.loading[menu.id] || false}
onClick={e => this.addToCart(e, menu.id)}
>
当ajax调用完成后,你只需调用setState函数,它在回调方法中将加载数组值设置为false。
答案 1 :(得分:0)
维护菜单ID ,而不是保持bool
,只要点击添加按钮,就可以将该项的ID推送到加载array
。生成卡片时,请检查加载array
是否具有array
,如果是,则显示加载,否则显示卡片。
像这样写:
id
答案 2 :(得分:0)
对于钩子们,这就是我所做的
const [isLoading, setIsLoading] = useState([]);
<button
type="button"
disabled={isLoading[item.username]}
className="btn btn-success btn-rounded btn-sm my-0"
onClick={()=>activateOrDeactivate( item.activated,item.username)}
> {isLoading[item.username] && <i className="fa fa-circle-o-notch fa-spin"></i>}
{isLoading[item.username]&& <span> Activating...</span>}
{!isLoading[item.username]&& <span>Activate</span>}</button>
const activateOrDeactivate = (valTrueOrFalse,newusername) => {
let loading = isLoading.slice();
loading[newusername] = true;
setIsLoading(loading)
let config = {
headers: {
Authorization: "Bearer " + state.token
},
};
api.post(
"process-activation",
{
activated: !valTrueOrFalse,
username:newusername
},
config
).then(
response => {
getAllUsers()
let loading = isLoading.slice();
loading[newusername] = false;
setIsLoading(loading)