代码解析React中setState同步和异步问题


Posted in Javascript onJune 03, 2021

 React起源于Facebook的内部项目。React的出现是革命性的创新,React的是一个颠覆式的前端框架。在React官方这样介绍的它:一个声明式、高效、灵活的、创建用户界面的JavaScript库,即使React的主要作用是构建UI,但是项目的逐渐成长已经使得react成为前后端通吃的WebApp解决方案。

 angular中用的是watcher对象,vue是观察者模式,react就是state了,他们各有各的特点,没有好坏之分,只有需求不同而选择不同。

      React的官方网址:https://reactjs.org/GitHub

地址为:https://github.com/facebook/react

1.在React中,由React控制的事件处理函数,如onClick, onChange等,setState是异步的

import React, { Component } from 'react';

export default class Input extends Component {
    constructor(props) {
        super(props);    

        this.state={
            name: 'hello'
        }    
    }

    _onChange(e) {
        this.setState({
            name:' world'
        })

        console.log(this.state.name); //hello
    }

  render () {
    return (
      <div className='cp'>
        <input className='cp-input'  value={this.state.name}  onChange={this._onChange.bind(this)} type="text"/>                
      </div>
    );
  }
}

2.在原生JS监听的事件中,如addEventListener, setState是同步的

import React, { Component } from 'react';

export default class Input extends Component {
    constructor(props) {
        super(props);    

        this.state={
            name: 'hello'
        }    
    }

    _onChange(e) {
        // do something
    }


    componentDidMount() {
        let input = document.querySelector('.cp-input');
        input.addEventListener('click', ()=>{
            this.setState({
                name:' world'
            })

            console.log(this.state.name); //world
        })
    }

  render () {
    return (
      <div className='cp'>
        <input className='cp-input'  value={this.state.name}  onChange={this._onChange.bind(this)} type="text"/>                
      </div>
    );
  }
}

3.在setTimeout中,setStatet是同步的

import React, { Component } from 'react';

export default class Input extends Component {
    constructor(props) {
        super(props);    

        this.state={
            name: 'hello'
        }    
    }

    _onChange(e) {
        // do something
    }


    componentDidMount() {
        setTimeout(()=>{
            this.setState({
                name:' world'
            })
            console.log(this.state.name); //world
        }, 1000)
    }

  render () {
    return (
      <div className='cp'>
        <input className='cp-input'  value={this.state.name}  onChange={this._onChange.bind(this)} type="text"/>                
      </div>
    );
  }
}

以上就是解析React中setState同步和异步代码详解的详细内容,更多关于React setState同步和异步的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
Jquery 获取checkbox的checked问题
Nov 16 Javascript
javascript中节点的最近的相关节点访问方法
Mar 20 Javascript
导航跟随滚动条置顶移动示例代码
Sep 11 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
JavaScript汉诺塔问题解决方法
Apr 21 Javascript
即将发布的jQuery 3 有哪些新特性
Apr 14 Javascript
JS本地刷新返回上一页代码
Jul 25 Javascript
Spring Boot/VUE中路由传递参数的实现代码
Mar 02 Javascript
小程序的上传文件接口的注意要点解析
Sep 17 Javascript
axios 实现post请求时把对象obj数据转为formdata
Oct 31 Javascript
详解Angular cli配置过程记录
Nov 07 Javascript
解决node终端下运行js文件不支持ES6语法
Apr 04 Javascript
React配置子路由的实现
手把手教你从零开始react+antd搭建项目
react antd实现动态增减表单
react 项目中引入图片的几种方式
Jun 02 #Javascript
小程序wx.getUserProfile接口的具体使用
js实现自动锁屏功能
Jun 02 #Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
You might like
PHP 删除一个目录及目录下的所有文件的函数代码
2010/05/26 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
ThinkPHP中url隐藏入口文件后接收alipay传值的方法
2014/12/09 PHP
php构造函数的继承方法
2015/02/09 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
基于PHP+Jquery制作的可编辑的表格的代码
2011/04/10 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
2016/02/25 Javascript
JS实现图片局部放大或缩小的方法
2016/08/20 Javascript
解析JavaScript实现DDoS攻击原理与保护措施
2016/12/26 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
bootstrap中的导航条实例代码详解
2019/05/20 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
element 动态合并表格的步骤
2020/12/31 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
python连接字符串的方法小结
2015/07/13 Python
python简单分割文件的方法
2015/07/30 Python
基于Python实现对PDF文件的OCR识别
2016/08/05 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
端午节活动策划方案
2014/03/09 职场文书
保护环境倡议书500字
2014/05/19 职场文书
中学生打架检讨书
2014/10/13 职场文书
银行贷款收入证明
2014/10/17 职场文书
三方股东合作协议书
2014/10/28 职场文书
煤矿安全生产工作总结
2015/08/13 职场文书
MySQL的索引你了解吗
2022/03/13 MySQL