React setState、useState到底是同步的,还是异步的?
setState语法
用法1:
this.setState({ // 数据更新})
用法2:
this.setState((state, props) => { // 以后组件的state // 父级的state}, () => { // 数据更新之后})
useState语法
用法1:
const [num, setNum] = useState(0);...setNum(1);
用法2:
const [num, setNum] = useState(0);...setNum(() => { // 数据操作});
setState是同步还是异步?
看一下上面的代码:
import React from 'react';import { Button } from 'antd-mobile';export default class App extends React.Component { constructor(props) { super(props); this.state = { count: 0 } } onButtonClick() { setTimeout(() => { this.setState({ count: 1 }) console.log('count00000', this.state.count); }) console.log('count111111', this.state.count); setTimeout(() => { console.log('count222222', this.state.count); }) } render() { return ( <div> <Button onClick={this.onButtonClick.bind(this)}>点击</Button> <div> 这个数字就是啊哈哈哈:{this.state.count} </div> </div> ) }}
打印后果:
setState 只在合成事件和钩子函数中是“异步”的,在原生事件和 setTimeout 中都是同步的。
合成事件:就是react 在组件中的onClick等都是属于它自定义的合成事件。
原生事件:比方通过addeventListener增加的,dom中的原生事件。
原生事件举例:
state = { count:0};componentDidMount() { document.body.addEventListener('click', this.changeVal, false);}changeVal = () => { this.setState({ number: 1 }) console.log(this.state.count)}
useState是同步还是异步?
看一下上面代码:
import React, { useState } from 'react';import { Button } from 'antd-mobile';import './index.scss';const HospitalInfo = () => { const [count, setCount] = useState(0); const onButtonClick = () => { setTimeout(() => { setCount(1); console.log('count0000', count) }) console.log('count111', count) setTimeout(() => { console.log('count222', count) }) } return ( <div className="page-hospital-container"> <Button onClick={onButtonClick}>点击</Button> <div>这个数字就是:{count}</div> </div> );};export default HospitalInfo;
而后,咱们发现都没有获取到最新值,阐明useState是异步的!
那如何获取最新值呢?
const [count, setCount] = useState(0); const countRef = useRef(count); countRef.current = count; const onButtonClick = () => { setTimeout(() => { setCount(1); console.log('count0000', count) }) console.log('count--Ref11', countRef) console.log('count111', count) setTimeout(() => { console.log('count222', count) console.log('count--Ref22', countRef) }) }
看一下后果:
咱们发现在Hooks最近中如果想要获取到最新值,须要在异步+Ref的形式能力获取到!
个人见解,有什么不对的中央,欢送大神评论区留言