响应事件
如需添加一个事件处理函数,你需要先定义一个函数,然后将其作为 prop 传入合适的 JSX 标签
1 2 3 4 5 6 7 8 9 10 11
| export default function Button() { function handleClick() { alert('你点击了我!'); }
return ( <button onClick={handleClick}> 点我 </button> ); }
|
事件处理函数:1、通常在你的组件内部定义。2、名称以 handle 开头,后跟事件名称。
也可以使用内联的事件处理函数或箭头函数。事件处理函数不需要是纯函数
1 2 3 4 5 6 7
| <button onClick={function handleClick() { alert('你点击了我!'); }}>
<button onClick={() => { alert('你点击了我!'); }}>
|
- 在事件处理函数中读取 props
由于事件处理函数声明于组件内部,因此它们可以直接访问组件的 props:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function AlertButton({ message, children }) { return ( <button onClick={() => alert(message)}> {children} </button> ); }
export default function Toolbar() { return ( <div> <AlertButton message="正在播放!"> 播放电影 </AlertButton> <AlertButton message="正在上传!"> 上传图片 </AlertButton> </div> ); }
|
- 将事件处理函数作为 props 传递
通常,我们会在父组件中定义子组件的事件处理函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| function Button({ onClick, children }) { return ( <button onClick={onClick}> {children} </button> ); }
function PlayButton({ movieName }) { function handlePlayClick() { alert(`正在播放 ${movieName}!`); }
return ( <Button onClick={handlePlayClick}> 播放 "{movieName}" </Button> ); }
function UploadButton() { return ( <Button onClick={() => alert('正在上传!')}> 上传图片 </Button> ); }
export default function Toolbar() { return ( <div> <PlayButton movieName="魔女宅急便" /> <UploadButton /> </div> ); }
|
- 命名事件处理函数 prop
组件的事件处理函数名称可以自定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| function Button({ onSmash, children }) { return ( <button onClick={onSmash}> {children} </button> ); }
export default function App() { return ( <div> <Button onSmash={() => alert('正在播放!')}> 播放电影 </Button> <Button onSmash={() => alert('正在上传!')}> 上传图片 </Button> </div> ); }
|
- 事件传播
事件会沿着树向上“冒泡”或“传播”。事件处理函数还将捕获任何来自子组件的事件
在 React 中所有事件都会传播,除了 onScroll,它仅适用于你附加到的 JSX 标签
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| export default function Toolbar() { return ( <div className="Toolbar" onClick={() => { alert('你点击了 toolbar !'); }}> <button onClick={() => alert('正在播放!')}> 播放电影 </button> <button onClick={() => alert('正在上传!')}> 上传图片 </button> </div> ); } // 如果你点击任一按钮,它自身的 onClick 将首先执行,然后父级 <div> 的 onClick 会接着执行。因此会出现两条消息。如果你点击 toolbar 本身,将只有父级 <div> 的 onClick 会执行
|
- 阻止传播
事件处理函数接收一个 事件对象 作为唯一的参数。按照惯例,它通常被称为 e ,代表 “event”(事件)。你可以使用此对象来读取有关事件的信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function Button({ onClick, children }) { return ( <button onClick={e => { // 阻止传播 e.stopPropagation(); onClick(); }}> {children} </button> ); }
export default function Toolbar() { return ( <div className="Toolbar" onClick={() => { alert('你点击了 toolbar !'); }}> <Button onClick={() => alert('正在播放!')}> 播放电影 </Button> <Button onClick={() => alert('正在上传!')}> 上传图片 </Button> </div> ); }
|
捕获阶段事件
通过在事件名称末尾添加 Capture 来实现
1 2 3 4
| <div onClickCapture={() => { /* 这会首先执行 */ }}> <button onClick={e => e.stopPropagation()} /> <button onClick={e => e.stopPropagation()} /> </div>
|
每个事件分三个阶段传播:
- 它向下传播,调用所有的
onClickCapture 处理函数。
- 它执行被点击元素的
onClick 处理函数。
- 它向上传播,调用所有的
onClick 处理函数。
- 阻止默认行为
1 2 3 4 5 6 7 8 9 10 11
| export default function Signup() { return ( <form onSubmit={e => { e.preventDefault(); alert('提交表单!'); }}> <input /> <button>发送</button> </form> ); }
|
参考:快速入门 – React 中文文档