React中DOM事件和状态介绍

目录
  • 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事件和状态内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • React中事件绑定this指向三种方法的实现

    1.箭头函数 1.利用箭头函数自身不绑定this的特点; 2.render()方法中的this为组件实例,可以获取到setState(); class App extends React.Component{ state ={ count: 0 } // 事件处理程序 onIncrement() { console.log('事件处理函数中的this:',this) this.setState({ count:this.state.count+1 }) } // 渲染 render() { re

  • React在组件中如何监听redux中state状态的改变

    目录 在组件中监听redux中state状态的改变 解决方式 React和redux的状态处理 在组件中监听redux中state状态的改变 解决方式 1.在组件中引入store 2.在constructor构造器方法中,重写store.subscribe方法(该方法即是监听state状态改变的放过) 组件完整代码如下: import React, { Component } from 'react' import CSSModules from 'react-css-modules'  imp

  • React事件绑定详解

    目录 类组件事件绑定 函数组件事件绑定 总结 React事件绑定和原生DOM事件绑定相似 语法:on+事件名={事件处理程序} 例如:onClick={()=>{}} 注意:React事件采用驼峰命名法 类组件事件绑定 import React from 'react'; import ReactDOM from 'react-dom'; class App extends React.Component { handleClick() { console.log(111); } render(

  • react合成事件与原生事件的相关理解

    1. 原生事件 原生事件就是js的原生事件,如通过document.addEventListener来设置的监听事件. 在react中即使有自己的一套事件机制(见下面合成事件),但有时候的业务场景我们仍然需要使用原生事件.比如我们封装一个Modal弹窗组件,需要在点击非弹窗区域时关掉弹窗,此时我们只能针对document进行原生点击事件监听. 由于原生事件需要绑定在真实DOM上,所以一般是在componentDidMount阶段或者组件/元素的ref的函数执行阶段进行绑定操作,并且注意要在com

  • React事件监听和State状态修改方式

    目录 React事件监听和State状态修改 React事件监听相关例子 React事件监听和State状态修改 on*函数可直接使用,但只能使用在html标签上,自己创建的组件标签不可 组件可以增加state状态,修改用setState方法,修改会有缓存,只能保证在渲染到页面之前会改好.所以setState后立马去使用值可能是不对的 狗子组件1:点击会打印bark和run class Dog extends Component {   bark () {     console.log('ba

  • React事件绑定的方式详解

    一.是什么 在react应用中,事件名都是用小驼峰格式进行书写,例如onclick要改写成onClick 最简单的事件绑定如下: class ShowAlert extends React.Component { showAlert() { console.log("Hi"); } render() { return <button onClick={this.showAlert}>show</button>; } } 从上面可以看到,事件绑定的方法需要使用{}

  • React在定时器中无法获取状态最新值的问题

    目录 在定时器中无法获取状态最新值 问题原因 问题解决 ReactHook hooks和定时器产生的bug 问题1 解决方案 在定时器中无法获取状态最新值 在做轮播图组件时发现了一个问题,在setInterval中无法通过状态直接获取最新值,如: const [rightTransform, setRightTransform] = useState(pictureSize); const autoPlay = () => { //普通轮播自动播放 timer.current = setInte

  • React中DOM事件和状态介绍

    目录 DOM事件 参数 作用域 状态 无状态组件 有状态组件 使用状态数据 初始化状态数据 修改状态数据 DOM事件 react中绑定事件的语法跟html中为元素绑定事件的语法相似, html中绑定事件: <div onclick="fn"></div>     react中绑定事件 <div onClick={this.fn}></div> 注意: 1 事件名称首字母必须大写 2 事件回调函数定义在组件中,我们通过插值语法引入绑定 3

  • JQuery中DOM事件合成用法实例分析

    本文实例讲述了JQuery中DOM事件合成用法.分享给大家供大家参考.具体分析如下: jQuery有两个合成事件--hover()方法和toggle()方法,类似前面讲过的ready()方法,hover()方法和toggle()方法都属于jQuery自定义的方法. hover()方法 hover()方法的语法结构为: hover(enter,leave); hover()方法用于模拟光标悬停事件.当光标移动到元素上时,会触发指定的第1个函数(enter);当光标移出这个元素时,会触发指定的第2个

  • 在react中使用vue的状态管理的方法示例

    我是要介绍一个新的 react 全局共享状态管理器,它和 vue 组件的状态管理一起同工之妙. 马上体验 在 react 状态管理领域,react-redux 可谓是只手遮天了,基于 flux 思想实现,小巧,immutable 的思想让数据变化可控.但 immutable 所带来的编程代价太大了,如果你要更新一个深层结构的对象的某个节点,写作将会是极其麻烦的一件事,而且还保不准会出错.为了保证 immutable,redux 的 reducer 机制让开发者掉光了头发.于是有了类似 dva.r

  • JQuery中DOM事件绑定用法详解

    本文实例讲述了JQuery中DOM事件绑定用法.分享给大家供大家参考.具体分析如下: 在文档加载完成后,如果打算为元素绑定事件来完成某些操作,则可以使用bind()方法来对匹配元素进行特定事件的绑定,bind()方法的调用格式为: bind( type [, data] , fn); bind()方法有3个参数,说明如下. 第1个参数是事件类型,类型包括:blur.focus.load.resize.scroll.unload.click.dblclick.mousedown.mouseup.m

  • JQuery中DOM事件冒泡实例分析

    本文实例分析了JQuery中DOM事件冒泡.分享给大家供大家参考.具体分析如下: 什么是冒泡 在页面上可以有多个事件,也可以多个元素响应同一个事件.假设网页上有两个元素,其中一个元素嵌套在另一个元素里,并且都被绑定了click事件,同时body元素上也绑定了click事件. <div id="content"> 外层div元素 <span>内层span元素</span> 外层div元素 </div> <script type=&qu

  • React中阻止事件冒泡的问题详析

    前言 最近在研究react.redux等,网上找了很久都没有完整的答案,索性自己整理下,这篇文章就来给大家介绍了关于React阻止事件冒泡的相关内容,下面话不多说了,来一起看看详细的介绍吧 在正式开始前,先来看看 JS 中事件的触发与事件处理器的执行. JS 中事件的监听与处理 事件捕获与冒泡 DOM 事件会先后经历 捕获 与 冒泡 两个阶段.捕获即事件沿着 DOM 树由上往下传递,到达触发事件的元素后,开始由下往上冒泡. IE9 及之前的版本只支持冒泡 |  A  --------------

  • ABP框架中的事件总线功能介绍

    目录 事件总线 关于事件总线 为什么需要这个东西 事件总线创建过程 订阅事件 事件 发布事件 全局异常加入事件总线功能 创建事件 订阅事件 发布事件 测试 记录事件 事件总线 关于事件总线 ABP 中,为了方便进程间通讯,给开发者提供了一个叫 事件总线 的功能,事件总线分为 本地事件总线.分布式事件总线,本篇文章讲的是 本地事件总线,系列教程中暂时不考虑讲解 分布式事件总线. 事件总线 需要使用 Volo.Abp.EventBus 库,ABP 包中自带,不需要额外引入. 事件总线是通过 订阅-发

  • 理解javascript中DOM事件

    首先,此文不讨论繁琐细节,但是考虑到读者的心灵感受,本着以积极向上的心态,在此还是会列举示例说明. ​标题为理解DOM事件,那么在此拿一个简单的点击事件为例,希望大家看到这个例子后能触类旁通. 最初我们给页面实现点击,就像下面这样的简单操作. 先定义一个块如<div id="weiyuzhou">微宇宙</div>,之后在<script type="text/javascript"></script>内部实现id为we

  • js中DOM事件绑定分析

    js事件绑定 JavaScript 有三种事件模型: 内联模型 脚本模型 DOM2 模型 1.内联模型 //基本废除不用 <input type="button" value="按钮" onclick="alert('Lee');" /> <input type="button" value="按钮" onclick="box();" /> 2.脚本模型 //基本

  • React中Portals与错误边界处理实现

    目录 Portals 错误边界处理 如果没有使用错误边界会怎样? 注意点 Portals 可以说是 插槽,但 不同于 Vue 中的 slot,它指的是将一个 React 元素渲染到指定的容器 (真实 DOM) 中 比如说,Modal 组件一般默认直接作为 body 的真实结构的子元素渲染出来,那么我们就可以借助 ReactDOM.createPortal(ReactElement, RealDOM container) 创建一个 React 元素,示例代码: import React from

随机推荐