第九章 React中的事件处理

简介: 第九章 React中的事件处理

   我们之前已经了解到在react中可以通过onXXX属性来指定处理事件的函数(注意大小写)。

  • 且该类型的事件是被react处理过,而并非是原生的DOM事件,这样做的原因是为了兼容性。
  • react的事件是通过事件委托的方式处理的,也就是委托给最外层的元素
  • react的事件有一个event参数,我们可以通过event.target拿到发生事件的DOM元素。

说到这里,我们可以优化一下之前的ref章节的案例:

class Demo extends React.Component {
      myRef1 = React.createRef()
      myRef2 = React.createRef()
      getData = () => {
        const val1 = this.myRef1.current.value
        console.log(val1)
      }
      blurData = () => {
        const val2 = this.myRef2.current.value
        console.log(val2)
      }
      render () {
        return (
          <div>
            <input ref={this.myRef1} type="text"/>&nbsp;
            <button onClick={this.getData}>click</button>&nbsp;
            <input ref={this.myRef2} onBlur={this.blurData} type="text"/>  
          </div>
        )
      }
    }
    // 2、将虚拟DOM渲染到页面,标签必须闭合
    ReactDOM.render(<Demo />,document.getElementById('app'))

在react的官方文档里面也说了,不要让我们过度使用ref,因为它会破坏组件的封装性。使用ref可以访问组件的DOM节点,但是这会使组件的实现细节泄漏到其使用者中。这使得组件更难以重构和维护,并且可能导致意外的副作用。另外,过度使用ref也可能会导致性能问题,因为它可能会使React无法正确地跟踪组件的状态和属性。因此,React建议尽可能避免使用ref,并使用props和状态来管理组件的行为和状态。

在以上案例中,我们可以看到,在获取第二个输入框的值时,是通过失去焦点事件,该事件就是在输入框元素本身上面。这个时候我们其实就不用ref,通过事件函数触发时拿到事件源就可以获取到值。改造:

class Demo extends React.Component {
      myRef1 = React.createRef()
      getData = () => {
        const val1 = this.myRef1.current.value
        console.log(val1)
      }
      blurData = (event) => {
        const val2 = event.target.value
        console.log(val2)
      }
      render () {
        return (
          <div>
            <input ref={this.myRef1} type="text"/>&nbsp;
            <button onClick={this.getData}>click</button>&nbsp;
            <input onBlur={this.blurData} type="text"/>  
          </div>
        )
      }
    }
    // 2、将虚拟DOM渲染到页面,标签必须闭合
    ReactDOM.render(<Demo />,document.getElementById('app'))

以上代码,我们在输入框失去焦点的事件中通过event.target.value同样拿到了输入框的值。因为该事件发生在元素自身上面。

结语

  • 熟练的使用react的事件处理,深度分析组件业务和逻辑构成
  • 不要过度使用ref造成性能上的问题
  • React的事件系统是跨浏览器的,而原生DOM事件在不同的浏览器中有不同的行为。React的事件系统还提供了更好的性能和更好的事件处理程序封装。
  • 此外,React的事件系统还支持事件委托和事件池,这些功能可以提高性能并减少内存使用。
相关文章
|
13小时前
|
存储 前端开发 JavaScript
【亮剑】如何处理 React 中的 onScroll 事件?
【4月更文挑战第30天】在React中,处理`onScroll`事件可实现复杂功能如无限滚动和视差效果。类组件和函数组件都能使用`onScroll`,通过`componentDidMount`和`componentWillUnmount`或`useEffect`添加和移除事件监听器。性能优化需注意节流、防抖、虚拟滚动、避免同步计算和及时移除监听器。实战案例展示了如何用Intersection Observer和`onScroll`实现无限滚动列表,当最后一项进入视口时加载更多内容。合理利用滚动事件能提升用户体验,同时要注意性能优化。
|
4天前
|
JavaScript 前端开发 开发者
深入比较Input、Change和Blur事件:Vue与React中的行为差异解析
深入比较Input、Change和Blur事件:Vue与React中的行为差异解析
|
29天前
|
前端开发 JavaScript 开发者
如何在React中监听键盘事件
如何在React中监听键盘事件
34 0
|
3月前
|
前端开发 JavaScript Java
react事件机制
react事件机制
39 0
|
3月前
|
前端开发 JavaScript
快速上手React:从概述到组件与事件处理
快速上手React:从概述到组件与事件处理
|
4月前
|
前端开发 JavaScript 开发者
说说react的事件机制?
React的事件机制是一种用于处理用户界面事件的方式,它建立在原生DOM事件的基础上,提供了一种更高级、更一致的方式来处理事件。
13 0
|
4月前
|
前端开发 开发者 UED
【第33期】一文学会用React事件
【第33期】一文学会用React事件
22 0
|
4月前
|
前端开发
React中事件的绑定
React中事件的绑定
|
5月前
|
前端开发 开发者
React合成事件的原理是什么
React合成事件的原理是什么
52 0
|
5月前
|
前端开发 JavaScript UED
React事件和原生事件的执行顺序
React事件和原生事件的执行顺序
32 0