Skip to content

事件处理

1. 使用HTML内置事件

比如原生常见事件有click,mouseOver等,监听鼠标点击:

jsx
import {useState} from 'react'
import './App.css'

function App() {
    const [count, setCount] = useState(0)
    const clickHandler = (e) => {
      console.log("e", e)
      setCount(count + 1)
    }
    return (
        <>
            <h1>Vite + React</h1>
            <div className="card">
              {/*test */}
                <button  onClick={clickHandler}>
                  count is {count}
                </button>
            </div>
        </>
    )
}

export default App

会发现打印的React中点击事件并不是原生事件,而是一个封装合成事件:
Alt text 可以看到里面有一个nativeEvent属性,它就是原生事件,但也不能完全认为是原生事件和我们想要的事件处理保持一致:
Alt text 我们也不能直接就认为React封装的事件对象和nativeEvent属性是保持一致的,比如我们监听的是mouseEnter事件,结果底层是处理的事件类型为mouseOver,如果发现事件处理和我们想的不一样,可以查看原生和合成事件是否一致。

2. 传参处理

传参处理方式有两种:

  • 普通箭头函数处理
  • 高阶函数处理(所谓高阶函数就是函数返回值还是一个函数)

2.1 箭头函数处理

jsx
import './App.css'

function App() {
  // 普通函数
  const clickHandler1 = (e, num) => {
    console.log(num)
    console.log(e)
  }
  return (
    <>
      <h1>Vite + React</h1>
      <div className="card">
        <button onClick={(e) => clickHandler1(e, 123)}>点击111</button>
      </div>
    </>
  )
}

export default App

2.2 高阶函数处理

jsx
import './App.css'

function App() {
  const clickHandler2 = (num) => {
    return (e)=>{
      console.log(num)
      console.log(e)
    }
  }
  return (
    <>
      <h1>Vite + React</h1>
      <div className="card">
        <button onClick={clickHandler2(123)}>点击222</button>
      </div>
    </>
  )
}
export default App

官方推荐使用箭头函数处理传参情景。