绑定事件

采用on+事件名的方式绑定一个事件,注意:这里和原生的事件是有区别的,原生的事件全是小写onclick,React里的事件是驼峰onClick,React的事件并不是原生事件,而是合成事件。 通过this访问

  1. import React from 'react'
  2. export default class App extends React.Component{
  3. // class中直接书写事件处理函数
  4. fn=()=>{
  5. alert('被点击了')
  6. }
  7. render(){
  8. return(
  9. <div>
  10. <button onClick={this.fn}> 点击 </button>
  11. </div>
  12. )
  13. }
  14. }
  15. // 传参写法
  16. // react中传参时需要加一层箭头函数
  17. fn=(n)=>{
  18. alert(n)
  19. }
  20. <button onClick={()=>{this.fn(10)}}> 点击 </button>
  • react-合成事件

事件绑定在了虚拟DOM上
底层原理是事件委托
react17版本是委托给了容器[root]
react17版本之前委托给了document
image.png

事件对象 - 键盘事件
回车时弹出input的value值

  1. import React from 'react'
  2. export default class App extends React.Component{
  3. // class中直接书写事件处理函数
  4. getVal=(e)=>{
  5. if(e.keyCode===13)alert(e.target.value)
  6. }
  7. render(){
  8. return(
  9. <div>
  10. <input type='text' placeholder='请输入...' onKeyDown={this.getVal} />
  11. </div>
  12. )
  13. }
  14. }

普通函数 - 事件this丢失的情况
以上两个案例中事件处理函数都是写成箭头函数的形式,当事件处理函数是普通函数时this会丢失,DOM身上的事件事件处理函数指向绑定事件的DOM,此时是虚拟DOM所以this指向undefined。即事件源是虚拟DOM。解决方案:bind
原因:
React组件是使用JSX编写,所有的JSX代码会通过Babe转意,babel编译后会开启严格模式,严格模式下函数this指向undefined

  1. // 1、调用函数时绑定bind
  2. <button onClick={this.Fn.bind(this)}>点击</button>
  3. // 2、构造函数中绑定
  4. import React from 'react'
  5. export default class App extends React.Component{
  6. // class中直接书写事件处理函数
  7. fn(){
  8. console.log('普通函数',this)
  9. }
  10. constructor(){
  11. super()
  12. this.fn=this.fn.bind(this)
  13. }
  14. render(){
  15. return(
  16. <div>
  17. <button onClick={this.fn}>点击</button>
  18. </div>
  19. )
  20. }
  21. }

问题⬇️

  1. import React from 'react'
  2. export default class App extends React.Component{
  3. // class中直接书写事件处理函数
  4. fn=()=>{
  5. console.log('箭头函数',this.Fn)
  6. }
  7. Fn(){
  8. console.log('普通函数',this.Fn)
  9. }
  10. render(){
  11. console.log(this.Fn)
  12. return(
  13. <div>
  14. <button onClick={this.fn}>点击</button>
  15. <button onClick={this.Fn()}>点击</button>
  16. </div>
  17. )
  18. }
  19. }

原生事件

原生事件指绑定在真实DOM上的事件
使用componentDidMount()生命周期钩子函数

  1. import React from 'react'
  2. export default class App extends React.Component{
  3. componentDidMount(){ // 后于render执行
  4. const btn =document.querySelector('button')
  5. btn.onclick=function(){
  6. alert('原生事件')
  7. }
  8. }
  9. render(){ // 先于componentDidMount执行
  10. return(
  11. <div>
  12. <button>点击</button>
  13. </div>
  14. )
  15. }
  16. }

componentDidMount() 和vue中的mounted功能一致