代碼解析React中setState同步和異步問題
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同步和異步的資料請關註WalkonNet其它相關文章!