代码解析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 相关文章推荐
javascript将数组插入到另一个数组中的代码
Jan 10 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
AngularJS通过$sce输出html的方法
Sep 22 Javascript
原生js实现倒计时--2018
Feb 21 Javascript
Node.js 使用命令行工具检查更新
Jun 08 Javascript
浅谈 Vue v-model指令的实现原理
Jun 08 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
jquery+css实现简单的图片轮播效果
Aug 07 jQuery
jQuery 禁止表单用户名、密码自动填充功能
Oct 30 jQuery
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
mpvue中使用flyjs全局拦截的实现代码
Sep 13 Javascript
JS实现动态无缝轮播
Jan 11 Javascript
React配置子路由的实现
手把手教你从零开始react+antd搭建项目
react antd实现动态增减表单
react 项目中引入图片的几种方式
Jun 02 #Javascript
小程序wx.getUserProfile接口的具体使用
js实现自动锁屏功能
Jun 02 #Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
Windows下安装PHP单元测试环境PHPUnit图文教程
2014/10/24 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
2015/03/26 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
JS输出空格的简单实现方法
2016/09/08 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
Angular2库初探
2017/03/01 Javascript
利用js定义一个导航条菜单
2017/03/14 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
JS实现数组深拷贝的方法分析
2019/03/06 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
详解小程序云开发攻略(解决最棘手的问题)
2019/09/30 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
JavaScript实现滚动加载更多
2020/12/27 Javascript
elementui实现预览图片组件二次封装
2020/12/29 Javascript
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
python简单实现计算过期时间的方法
2015/06/09 Python
用Python shell简化开发
2018/08/08 Python
python 获取页面表格数据存放到csv中的方法
2018/12/26 Python
Django用户认证系统 组与权限解析
2019/08/02 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
pytorch AvgPool2d函数使用详解
2020/01/03 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
美国紧身牛仔裤品牌:NYDJ
2017/05/24 全球购物
韩语专业本科生求职信
2013/10/01 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
黄金搭档广告词
2014/03/21 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
MySQL数据库Innodb 引擎实现mvcc锁
2022/05/06 MySQL