当前位置: 首页 > article >正文

第九章 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的事件系统还支持事件委托和事件池,这些功能可以提高性能并减少内存使用。

http://www.kler.cn/a/6026.html

相关文章:

  • kotlin sortedBy 与sortedWith的区别
  • 第四、五章补充:线代本质合集(B站:小崔说数)
  • 丢帧常见的几种处理方法
  • GoChina备案管家
  • 分享:osgb倾斜数据转cesium-3dtiles 小工具.
  • Mesa llvmpipe和softpipe对比
  • ​力扣解法汇总1641. 统计字典序元音字符串的数目
  • MySQL OCP888题解071-干净关闭MySQL服务器
  • Matlab实现PCA算法(附上完整仿真源码)
  • AD360自助式密码管理
  • ActiViz.NET 9.2.2023 Crack
  • ToBeWritten之物联网通信接口调试
  • react常用语法
  • 2023年 合肥市庐阳区信息学竞赛区赛 小学组
  • shiro知识点梳理
  • Python 自动化指南(繁琐工作自动化)第二版:七、使用正则表达式的模式匹配
  • ES、MongoDB、HBase的区别和使用场景
  • 一起Talk Android吧(第五百三十六回:RxJava中的事件转换)
  • 浅谈常量字符串
  • java基础:java泛型相关内容
  • 代码管理平台Codeup测评
  • 蓝桥杯第15天(Python版)(数论)
  • 【Ruby学习笔记】1.Ruby的简介、环境、Linux安装及Windows安装
  • 高级Java工程师面试题经典面试题1220道(附答案)
  • Python 自建项目上传到 PyPI 之后通过 pip 可安装
  • 自己动手写CPU——第一篇