响应事件
React 通过事件处理函数来响应用户交互:点击、输入、滚动、提交表单等。你把一个函数传给 JSX 属性(例如 onClick),当事件发生时 React 会调用它。
最小例子:点击按钮
TypeScript
export default function Button() {
function handleClick() {
alert('你点击了按钮!');
}
return <button onClick={handleClick}>点我</button>;
}把事件处理函数当作 props 传下去
这是一种常见模式:父组件拥有“做什么”的逻辑,子组件只负责触发。
TypeScript
function Child({ onAdd }: { onAdd: () => void }) {
return <button onClick={onAdd}>+1</button>;
}
export default function Parent() {
function handleAdd() {
console.log('加一');
}
return <Child onAdd={handleAdd} />;
}小技巧
如果你发现 props 一层层往下传很痛苦,可以考虑 Context,但别急着上 Context。 很多时候把组件拆小、把 state 往上提就够了。
阻止默认行为:表单不会刷新页面
TypeScript
export default function Newsletter() {
function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
e.preventDefault();
alert('这里改成你自己的提交逻辑');
}
return (
<form onSubmit={handleSubmit}>
<input name="email" placeholder="email@example.com" />
<button type="submit">订阅</button>
</form>
);
}事件冒泡与 stopPropagation
在 DOM 里,事件会从内到外冒泡。你经常会遇到“点了按钮却触发了卡片点击”的情况。
TypeScript
export default function Card() {
function onCardClick() {
alert('打开详情页');
}
function onDeleteClick(e: React.MouseEvent) {
e.stopPropagation();
alert('删除');
}
return (
<div onClick={onCardClick} role="button" tabIndex={0}>
<span>一张卡片</span>
<button onClick={onDeleteClick}>删除</button>
</div>
);
}进一步阅读
动手练习
运行并修改下面的组件,熟悉交互式示例的编辑与预览。
🌐浏览器运行