React中DOM事件和状态介绍

 更新时间:2022年08月28日 14:31:39   作者:公众号_前端每日技巧  
这篇文章主要介绍了React中DOM事件和状态介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下

DOM事件

react中绑定事件的语法跟html中为元素绑定事件的语法相似,

html中绑定事件:

<div onclick="fn"></div>
    react中绑定事件
<div onClick={this.fn}></div>

注意:

  • 1 事件名称首字母必须大写
  • 2 事件回调函数定义在组件中,我们通过插值语法引入绑定
  • 3 事件回调函数不能执行(后面不能添加参数集合())

绑定的是一个未执行的方法

参数

React使用了事件委托模式实现事件的绑定(事件委托模式特点:1 减少事件数量, 2 预言未来元素, 3 防止内存外泄)

vue没有实现事件委托,参数就是源生的事件对象

jquery实现了事件委托模式,参数是jquery封装后的事件对象

react中的DOM事件是基于事件委托模式实现的,因此参数就是react封装的事件对象(16版本就一个参数)

因此可以通过事件对象准确的获取绑定事件的元素,以及触发事件的元素。

作用域

react中的DOM事件回调函数

ES5开发中,this指向组件实例化对象,并且是不能改变的

ES6开发中,this默认是undefined,我们未来访问组件中的其他数据,我们要绑定作用域

改变作用域由两种方式:

  • 第一种,使用ES5提供的bind方法,改变作用域
  • 第二种,使用ES6提供的箭头函数,是定义时的作用域

一旦改变了作用域,我们是可以传递自定义参数的

bind方式改变的作用域,传递的自定义参数始终在事件对象前面

箭头函数改变的作用域,传递的自定义参数可以在任何位置。

在ES6开发中,事件回调函数允许我们绑定其他的对象,但是工作中,不建议绑定组件之外的其他对象

举例:

// 定义类
 class Demo extends Component {
  // 事件回调函数
  clickBtn(e) {
      console.log(this, arguments)
      // console.log(e.target, e.currentTarget)
  }
  // 渲染
  render() {
      return (
          <div>
              <button onClick={this.clickBtn}><span>按钮</span>1</button>
              {/*更改this*/}
              <button onClick={this.clickBtn.bind(this, 100, 'hello', true)}>按钮2</button>
              <button onClick={e => this.clickBtn(100, e, 'demo', false)}>按钮3</button>
              {/*工作中,不建议绑定组件之外的其他对象*/}
              <button onClick={this.clickBtn.bind(obj)}>按钮4</button>
          </div>
      )
  }
}

状态

组件有两类数据,一类是属性数据,一类就是状态数据

属性数据是在组件外部传递给组件的,因此在组件外部维护

状态数据是在组件内部使用的,因此在组件内部维护

根据组件是否有状态数据,可以将组件分成两类,一类是无状态是组件,一类是有状态组件

无状态组件

如果组件创建完成,组件就是一成不变的,组件不会产生交互,不会发送请求,这类组件就是无状态组件

我们目前所学习的组件,都是无状态组件

无状态组件还可以简写成一个函数

无状态组件也叫state less component

有状态组件

如果组件创建完成后,会与用户产生交互,会发送异步请求等等,在组件内部就会产生数据,为了维护这部分数据,我们可以将这部分数据放在状态中,这样的组件就是有状态组件。

这里的数据就是状态数据

使用状态数据

使用状态数据跟使用属性数据一样,也是通过this.state来使用。

初始化状态数据

我们在组件的构造函数中,初始化状态数据。

es6中通过constructor定义构造函数,由于我们的组件继承了Component组件基类,

并且重写了构造函数constructor,为了在构造函数内实现构造函数继承,我们要使用super关键字

构造函数有props属性数据参数,为了继承它,我们要将props参数传递给super方法

super(props);

如果不传递:在构造函数中,this.props目前是undefined

由于继承了props,所以在构造函数中props和this.props没有区别了

初始化状态

在构造函数中,通过为this.state赋值即可。

注意:由于在构造函数中,我们可以访问属性数据,因此我们可以用属性数据为状态数据赋值,这样可以实现数据有外部流入内部(工作中常见)

修改状态数据

组件提供了一个this.setState的方法,可以在组件内部修改状态数据

参数是对象

key表示状态属性数据名称

value表示状态数据值

注意:无论是组件的属性数据发生改变,还是状态数据发生改变,组件都会执行render方法。

// 无状态组件内部不需要维护数据,因此可以简写成函数
 let Demo = () => <button>按钮</button>
 // 定义换一换组件
 class Demo extends Component {
 // 初始化状态数据
 constructor(props) {
      // 构造函数继承
      super(props);
      // console.log(this.props, props)
      // 初始化状态
      this.state = {
          num: 0
      }
  }
 // 定义子视图列表
 createChildList(arr) {
      // 将数组成员转成span
      return arr.map((item, index) => <span key={index}>{item}</span>)
  }
  // 创建新闻列表
  createList() {
      // console.log(this)
      // 获取数据长度
      let len = this.props.data.length;
      return this.props.data.map((item, index) => {
          // 遍历第二维数组,如果num与index相等,要显示
          return <li key={index} style={{
              display: this.state.num % len === index ? '' : 'none'
          }}>{this.createChildList(item)}</li>
      })
  }
  // 事件回调函数
  toggle() {
      // 更新num
      // var num = this.state.num;
      // // 下一页
      // num++;
      // 更新状态
      // this.setState({ num })
      // 简化成一步
      this.setState({
          // 先加再更新
          num: ++this.state.num
      })
  }
  // 定义渲染方法
  render() {
      return (
          <div>
              {/*<span onClick={this.toggle.bind(this)}>换一换</span>*/}
              <span onClick={e => this.toggle(e)}>换一换</span>
              {/*新闻列表*/}
              <ul>{this.createList()}</ul>
          </div>
      )
  }
}

到此这篇关于React中DOM事件和状态介绍的文章就介绍到这了,更多相关React事件和状态内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用React18和WebSocket构建实时通信功能详解

    使用React18和WebSocket构建实时通信功能详解

    WebSocket是一种在Web应用中实现双向通信的协议,它允许服务器主动向客户端推送数据,而不需要客户端发起请求,本文将探索如何在React 18应用中使用WebSocket来实现实时通信,感兴趣的可以了解下
    2024-01-01
  • react 实现页面代码分割、按需加载的方法

    react 实现页面代码分割、按需加载的方法

    本篇文章主要介绍了react 实现页面代码分割、按需加载的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 再次谈论React.js实现原生js拖拽效果引起的一系列问题

    再次谈论React.js实现原生js拖拽效果引起的一系列问题

    React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.本文给大家介绍React.js实现原生js拖拽效果,需要的朋友一起学习吧
    2016-04-04
  • React中常见的动画实现的几种方式

    React中常见的动画实现的几种方式

    本篇文章主要介绍了React中常见的动画实现的几种方式,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • React钩子函数之useDeferredValue的基本使用示例详解

    React钩子函数之useDeferredValue的基本使用示例详解

    useDeferredValue是React 18中非常有用的一个钩子函数,它可以帮助我们优化渲染性能,并让UI更加流畅,如果你还没有尝试过它,不妨在你的下一个React项目中试一试,这篇文章主要介绍了React钩子函数之useDeferredValue的基本使用,需要的朋友可以参考下
    2023-08-08
  • 深入浅析react native es6语法

    深入浅析react native es6语法

    这篇文章主要介绍了深入浅析react native es6语法的相关资料,需要的朋友可以参考下
    2015-12-12
  • React高阶组件优化文件结构流程详解

    React高阶组件优化文件结构流程详解

    高阶组件就是接受一个组件作为参数并返回一个新组件(功能增强的组件)的函数。这里需要注意高阶组件是一个函数,并不是组件,这一点一定要注意,本文给大家分享React 高阶组件HOC使用小结,一起看看吧
    2023-01-01
  • react项目中redux的调试工具不起作用的解决

    react项目中redux的调试工具不起作用的解决

    这篇文章主要介绍了react项目中redux的调试工具不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • mobx在react hooks中的应用方式

    mobx在react hooks中的应用方式

    这篇文章主要介绍了mobx在react hooks中的应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • React Native全面屏状态栏和底部导航栏适配教程详细讲解

    React Native全面屏状态栏和底部导航栏适配教程详细讲解

    最近在写 React Native 项目,调试应用时发现顶部状态栏和底部全面屏手势指示条区域不是透明的,看起来很难受。研究了一下这个问题,现在总结一下解决方案,这篇文章主要介绍了React Native全面屏状态栏和底部导航栏适配教程
    2023-01-01

最新评论