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

长沙网站备案拍照点优化网站教程

长沙网站备案拍照点,优化网站教程,四川有那些网站建设公司,网站工程师培训价格文章目录 一文讲清楚React中setState的使用方法和机制1. setState是什么2. setState方法详解2.1 setState参数详解2.2 setState同步异步问题2.2.1 setState异步更新2.2.2 setState同步更新 一文讲清楚React中setState的使用方法和机制 1. setState是什么 React中,…

文章目录

  • 一文讲清楚React中setState的使用方法和机制
  • 1. setState是什么
  • 2. setState方法详解
    • 2.1 setState参数详解
    • 2.2 setState同步异步问题
      • 2.2.1 setState异步更新
      • 2.2.2 setState同步更新

一文讲清楚React中setState的使用方法和机制

1. setState是什么

  • React中,this.setState(updater,callback)是一个方法,用来改变state的值,进而实现页面的重新渲染
  • 不了解的先看这篇文章一文讲清楚React中state和props的区别与联系
  • 直接上例子
import React from 'react'
class App extends React.Component{constructor(props){super(props)this.state={name:'tom'}}handleClick=()=>{this.setState({name:'new tom'})}render(){return(<div><div>{this.state.name}</div><button onClick={this.handleClick}>change name in by setState</button></div>)}
}
export default App
  • 运行显示tom,点击按钮通过setState方法把name改为new tom,发现页面显示成了new tom

2. setState方法详解

2.1 setState参数详解

  • setState由两个参数,updater和callback,updater可以是对象也可以是函数
  • 我们下一个计数器的demo
import React from 'react'
class App extends React.Component{constructor(props){super(props)this.state={count:0}}handleClick=()=>{this.setState(preState=>({count:preState.count+1}))}render(){return(<div><div>{this.state.count}</div><button onClick={this.handleClick}>+1</button></div>)}
}
export default App
  • 点击+1,也能实现状态的改变并现实出来
  • 那么对象参数和函数参数有什么区别呢,先给出答案,如果是参数是对象,会进行事件合并,如果参数是函数,不会发生事件合并,上代码
  • 我们设置两个计数器,一个从参数对象更新,一个用参数函数更新,每点击一次按钮,计数器做三次+1操作
import React from 'react'
class App extends React.Component{constructor(props){super(props)this.state={count1:0,count2:0,}}handleClick=()=>{//第一个计数器用对象参数执行三次+1this.setState({count1:this.count1+1})this.setState({count1:this.count1+1})this.setState({count1:this.count1+1})//第2个计数器用函数参数执行三次+1this.setState(preState=>({count2:preState.count2+1}))this.setState(preState=>({count2:preState.count2+1}))this.setState(preState=>({count2:preState.count2+1}))}render(){return(<div><div>count1:{this.state.count1}</div><div>count2:{this.state.count2}</div><button onClick={this.handleClick}>+1</button></div>)}
}
export default App
  • 运行
    在这里插入图片描述

  • 初始值都是0没问题

  • 然后点按钮
    在这里插入图片描述

  • 会发现count1只+1,而count2+3,这是因为setState在参数为对象的模式下,对批量操作会进行覆盖,只取最后一次结果执行

  • setState还有第二个参数,callback,我们在下面讲

2.2 setState同步异步问题

2.2.1 setState异步更新

  • 先直接上代码
import React from 'react'
class App extends React.Component{constructor(props){super(props)this.state={count:0}}handleClick=()=>{this.setState(preState=>({count:preState.count+1}))console.log(this.state.count)}render(){return(<div><div>{this.state.count}</div><button onClick={this.handleClick}>+1</button></div>)}
}
export default App
  • 运行,处置为.,然后点击+1按钮,发现页面显示1,但是console.log打印0
    在这里插入图片描述

  • 这是为什么呢,这是因为React在合成事件中,state是异步更新的

  • 为什么会是一步的呢,问题就出现在合成事件上,不懂合成事件的看这篇文章一文讲清楚React合成事件机制和this的绑定问题

  • 因为合成事件的原因,console.log的执行时机别state更新的时机要早,所以造成了异步现象

  • 同理,在生命周期函数中改变状态也会造成异步更新

  • 如果想要拿到更新后的state,就需要setState第二个参数callback,他会在UI更新后被调用

  • 我们这么改一下代码

import React from 'react'
class App extends React.Component{constructor(props){super(props)this.state={count:0}}handleClick=()=>{this.setState(preState=>({count:preState.count+1}),()=>{console.log(this.state.count)})}render(){return(<div><div>{this.state.count}</div><button onClick={this.handleClick}>+1</button></div>)}
}
export default App
  • 这时候我们拿到了同步的值
    在这里插入图片描述

2.2.2 setState同步更新

  • 上面说因合成事件会导致异步更新,那如果我们使用原生事件呢,上代码
import React from 'react'
class App extends React.Component{constructor(props){super(props)this.state={count:0}}componentDidMount(){document.getElementById('update').addEventListener('click',this.handleClick)}handleClick=()=>{this.setState(preState=>({count:preState.count+1}))console.log(this.state.count)}render(){return(<div><div>{this.state.count}</div><button id="update">+1</button></div>)}
}
export default App
  • 运行会发现,还是打印0,哈哈哈,那是因为React在V16版本前,在原生事件和setTimeout中setState是同步事件,这里本来想演示这个来着,但是奈何坐着的React的版本比较高,这里建议大家切换低版本自己运行一下,代码肯定是没有任何问题的
  • React为了让setState在所有场景下保持一致性,从V16+开始,无论是合成事件、原生事件还是setTimeout都是保持异步,要获取更新后的状态请统一使用setState第二个回调函数

文章转载自:

http://qaf9peJe.mcndn.cn
http://WjGBTTiA.mcndn.cn
http://IEBu4sr0.mcndn.cn
http://rKsQvWDX.mcndn.cn
http://DwBnFVIo.mcndn.cn
http://A0mUUAjv.mcndn.cn
http://SguXB2jV.mcndn.cn
http://niGKNovD.mcndn.cn
http://bDsJ8dJI.mcndn.cn
http://7twZdp1o.mcndn.cn
http://WHDKTgKK.mcndn.cn
http://sndt5Qyv.mcndn.cn
http://X84eAWpa.mcndn.cn
http://QCDloIYG.mcndn.cn
http://FuiYj5HV.mcndn.cn
http://wI9PUQeP.mcndn.cn
http://u9ZBV3qV.mcndn.cn
http://Rpc93mqy.mcndn.cn
http://uejP3862.mcndn.cn
http://8Lbt8SxH.mcndn.cn
http://uG0dfkGT.mcndn.cn
http://BTxi7Nib.mcndn.cn
http://Dx3gCx9X.mcndn.cn
http://YbAvHCjg.mcndn.cn
http://wCKeJpSN.mcndn.cn
http://mo5u4CYB.mcndn.cn
http://9MlrYVHs.mcndn.cn
http://rob91Y3u.mcndn.cn
http://rJ0BhAtR.mcndn.cn
http://Dh6Wetbl.mcndn.cn
http://www.dtcms.com/wzjs/688689.html

相关文章:

  • 博望网站建设全媒体运营师报考条件
  • 电子商务网站建设与维护概述wordpress悬浮小人
  • seo做子网站绍兴专门做网站
  • 外贸网站建设公司方案包头北京网站建设
  • 青岛崂山建设局网站万网网站域名
  • 华为网站建设策划书网站建设吉金手指专业12
  • 什么是电子商务网站绝唯cms网站管理系统
  • 有什么做任务拿钱的网站拉新推广平台有哪些
  • 公司建设网站的费用企业手机网站程序是什么
  • 手机如何制作网站和网页安阳县公共资源交易中心
  • 加网络网站建设工作室网站维护要多久时间
  • 自己网站建设基本流程网站建设服装项目设计书
  • 厦门安能建设品牌网站建设wordpress弹出式表单
  • phpcms怎么做网站搜索网站排名优化策略
  • 搜索网站老是跳出别的网站要怎么做网站开发文章怎么分类
  • 外贸公司网站建设 重点是什么意思自己创建网站怎么得流量钱
  • 上海网站关键词优化用dw做的网站怎么发布
  • 福建网站开发速成班广告公司名字 三个字
  • 一键做网站商务网站建设与推广实训报告
  • 开发网站公司排行电商网站流量统计
  • 中山建设安监站网站集约化网站群建设情况
  • 网站内容及内链建设网站cron
  • 网站开发小作业查房价的官方网站
  • 有做的小说网站植物染企业解决方案
  • 工作室网站建设的意义济南 微网站
  • 网站建设目标定位如何看一个网站的备案在哪里做的
  • 仿网站百度会怎么做wordpress附加字段
  • 深圳宝安高端网站建设免费发布的空间
  • go语言做的网站在家做网站建设
  • 辛集做网站建设一个企业网站一般多少钱