合成事件是 React 事件系统的核心抽象:它把原生 DOM 事件包一层,提供统一接口(target、preventDefault、stopPropagation 行为一致),并补齐不同浏览器的差异。React 17 之后事件委托从 document 收回到挂载根节点,但开发者侧的用法没有变化,依旧写 onClick 这类驼峰属性。
事件对象是按事件类型池化复用的:事件回调执行结束后对象属性会被重置,异步代码里再访问 e.target 得到的是 undefined,需要先 e.persist() 或提前取值。另外 onClickCapture、focus、blur 等的捕获冒泡语义与原生一致,冒泡过程中 React 合成事件与原生事件并不互相阻断。
import { useState } from 'react'; export default function App() { const [val, setVal] = useState(''); const handleChange = (e) => { const target = e.target; // 先取值,异步安全 setTimeout(() => setVal(target.value), 0); }; const handleClick = (e) => { e.preventDefault(); // 统一接口,跨浏览器一致 setTimeout(() => setVal('提交完成'), 300); }; return ( <form> <input value={val} onChange={handleChange} /> <button onClick={handleClick}>提交</button> </form> ); }