You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React子组件onClick绑定错误原因及正确写法疑问

为什么React子组件中直接调用handleDelete会报错?

一、错误写法的问题所在

你写的代码:

<button onClick={handleDelete(blog.id)}>delete</button>

这里的handleDelete(blog.id)是直接执行函数,而非传递一个点击时触发的回调。也就是说,当BlogList组件渲染的瞬间,这个函数就会立刻被调用,根本等不到你点击按钮。

而handleDelete内部调用了setBlogs,这会触发父组件Home的状态更新,进而引发重新渲染。但React有严格的渲染规则:不允许在渲染某个组件的过程中,更新另一个组件的状态。此时BlogList还处于渲染流程中,却触发了Home的状态更新,所以就抛出了错误:

Cannot update a component (Home) while rendering a different component (BlogList).

二、正确写法的原理

改成箭头函数的写法:

<button onClick={()=>handleDelete(blog.id)}>delete</button>

这里传递给onClick的是一个未执行的箭头函数,它相当于一个“待触发的回调”。只有当用户点击按钮时,这个箭头函数才会被执行,进而调用handleDelete(blog.id)。

这时候组件已经完成了渲染流程,调用setBlogs触发父组件状态更新完全符合React规则,自然不会报错。

另外还有一种等价写法是使用bind绑定参数:

<button onClick={handleDelete.bind(null, blog.id)}>delete</button>

原理和箭头函数一致,都是把带参数的函数包装成回调,只在点击时执行。

内容的提问来源于stack exchange,提问作者Jason Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 10:50:15