代码解析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 Memoization 让函数也有记忆功能
Oct 27 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
Oct 22 Javascript
JavaScript插件化开发教程 (四)
Jan 27 Javascript
使用jQueryMobile实现滑动翻页效果的方法
Feb 04 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
jquery制做精致的倒计时特效
Jun 13 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
Jul 09 Javascript
jQuery插件Validation快速完成表单验证的方式
Jul 28 Javascript
canvas快速绘制圆形、三角形、矩形、多边形方法介绍
Dec 29 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
Apr 13 Javascript
微信小程序蓝牙连接小票打印机实例代码详解
Jun 03 Javascript
React配置子路由的实现
手把手教你从零开始react+antd搭建项目
react antd实现动态增减表单
react 项目中引入图片的几种方式
Jun 02 #Javascript
小程序wx.getUserProfile接口的具体使用
js实现自动锁屏功能
Jun 02 #Javascript
如何将JavaScript将数组转为树形结构
Jun 02 #Javascript
You might like
某大型网络公司应聘时的笔试题目附答案
2008/03/27 PHP
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
xtree.js 代码
2007/03/13 Javascript
?牟┛途W扣了一??效果出?? target=
2007/05/27 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
2015/06/11 Javascript
Bootstrap导航栏各元素操作方法(表单、按钮、文本)
2015/12/28 Javascript
js中利用tagname和id获取元素的方法
2016/01/03 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
解决JQuery全选/反选第二次失效的问题
2017/10/11 jQuery
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
vue实现动态列表点击各行换色的方法
2018/09/13 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
微信小程序实现列表的横向滑动方式
2020/07/15 Javascript
Python实现的生成自我描述脚本分享(很有意思的程序)
2014/07/18 Python
python实现斐波那契递归函数的方法
2014/09/08 Python
python黑魔法之参数传递
2016/02/12 Python
Python解决线性代数问题之矩阵的初等变换方法
2018/12/12 Python
python logging模块书写日志以及日志分割详解
2019/07/22 Python
Python使用python-docx读写word文档
2019/08/26 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
详解Pymongo常用查询方法总结
2021/01/29 Python
css3实现背景颜色渐变让图片不再是唯一的实现方式
2012/12/18 HTML / CSS
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
单方投资意向书
2015/05/11 职场文书
2015年普法依法治理工作总结
2015/05/26 职场文书
党支部半年考察意见
2015/06/01 职场文书
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
我去timi了,一起去timi是什么意思?
2022/04/13 杂记
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers