React 事件处理

交互靠事件驱动:点击、输入、提交、键盘操作等。React 事件与原生 DOM 事件很接近,但在命名与绑定方式上有明确的约定差别。学会事件处理,界面才能真正"响应"用户的操作。

事件名与写法约定

React 事件名采用驼峰命名(onClick、onChange),绑定的值必须是函数而不是字符串:

function App() {
  function handleClick() {
    console.log('按钮被点击')
  }
  return <button onClick={handleClick}>点我</button>
}

注意传的是函数本身 handleClick,不能写成 handleClick(),否则函数会在渲染时立刻执行,而不是点击时才执行。

事件对象 e

事件处理函数能收到一个合成事件对象(SyntheticEvent),用法与原生事件一致,常用 e.preventDefault() 阻止默认行为:

function SubmitForm() {
  function handleSubmit(e) {
    e.preventDefault() // 阻止表单提交导致的页面刷新
    console.log('提交了表单')
  }
  return (
    <form onSubmit={handleSubmit}>
      <button type="submit">提交</button>
    </form>
  )
}

给处理函数传参数

需要额外参数时,用箭头函数在外面包一层:

function ColorList() {
  const colors = ['红', '绿', '蓝']
  function pick(color) {
    console.log('选中了', color)
  }
  return (
    <ul>
      {colors.map(c => (
        <li key={c} onClick={() => pick(c)}>颜色 {c}</li>
      ))}
    </ul>
  )
}

类组件中 this 的绑定

普通类方法作为事件处理函数时 this 会丢失,最省事的做法是把它定义成箭头函数属性,或用箭头函数包裹调用:

import { Component } from 'react'
class Counter extends Component {
  state = { count: 0 }
  handleClick = () => {
    this.setState({ count: this.state.count + 1 })
  }
  render() {
    return <button onClick={this.handleClick}>点击 {this.state.count}</button>
  }
}

事件里更新状态:受控组件

事件最常见的用途是修改 state,让界面跟随用户操作。以输入框为例,onChange 里读取 e.target.value 再写回 state,输入框就变成了"受控组件":

import { useState } from 'react'
function SearchBox() {
  const [text, setText] = useState('')
  return (
    <input
      value={text}
      onChange={e => setText(e.target.value)}
      placeholder="请输入关键词"
    />
  )
}

用户在输入框敲字时,value 被同步进 state,界面与数据始终保持一致。

小结:React 事件三要点——驼峰命名并传函数引用;需要参数时用箭头函数包一层;类组件记得用箭头函数属性绑定 this。配合 setState / useState,就能做出各种交互效果。

笔记加载中…