对于类组件,this.setState
如果在事件处理程序内部,则调用批处理。但是,如果在事件处理程序外部并使用useState
钩子来更新状态,会发生什么?
function Component() {
const [a, setA] = useState('a');
const [b, setB] = useState('b');
function handleClick() {
Promise.resolve().then(() => {
setA('aa');
setB('bb');
});
}
return <button onClick={handleClick}>{a}-{b}</button>
}
它会立即渲染aa - bb
吗?还是会aa - b
然后aa - bb
呢?
TL; DR –如果状态更改是异步触发的(例如,包装在Promise中),则不会进行批处理;如果直接触发它们,将对其进行批处理。
我已经设置了一个沙箱来尝试一下:https :
//codesandbox.io/s/402pn5l989
import React, { Fragment, useState } from 'react';
import ReactDOM from 'react-dom';
import './styles.css';
function Component() {
const [a, setA] = useState('a');
const [b, setB] = useState('b');
console.log('a', a);
console.log('b', b);
function handleClickWithPromise() {
Promise.resolve().then(() => {
setA('aa');
setB('bb');
});
}
function handleClickWithoutPromise() {
setA('aa');
setB('bb');
}
return (
<Fragment>
<button onClick={handleClickWithPromise}>
{a}-{b} with promise
</button>
<button onClick={handleClickWithoutPromise}>
{a}-{b} without promise
</button>
</Fragment>
);
}
function App() {
return <Component />;
}
const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
我做了两个按钮,一个触发状态更改,就像您的代码示例一样,包装在一个promise中,另一个触发状态更改。
如果您查看控制台,则在单击“ promise”按钮时,它将首先显示a aa
和b b
,然后显示a aa
和b bb
。
因此答案是否定的,在这种情况下,它不会立即渲染aa - bb
,每次状态更改都会触发一个新的渲染,没有批处理。
但是,当您点击按钮“不承诺”,控制台将显示a aa
和b bb
马上。
因此,在这种情况下,React会批处理状态更改,并为两者一起进行一个渲染。
对于类组件,在事件处理程序中调用批处理。但是,如果状态在事件处理程序之外更新并使用hook,会发生什么呢? 它会立即渲染?或者它将是,然后是?
它几乎添加了一个对象,该对象包含来自主窗体的子窗体的值。 这是我用作按钮的函数的函数。 这将一个新对象添加到一个名为的状态,该状态是一个对象数组。 提前谢了。
问题内容: 我正在尝试新的React Hooks,并有一个带有计数器的Clock组件,该计数器应该每秒增加一次。但是,该值不会增加到超过一。 问题答案: 原因是传递给的闭包中的回调仅访问第一个渲染器中的变量,而无法访问后续渲染器中的新值,因为第二次未调用。 回调中的值始终为0 。 就像您熟悉的状态挂钩一样,状态挂钩有两种形式:一种是处于更新状态的状态,另一种是将当前状态传入的回调形式。您应该使用第
我正在试用新的反应挂钩,并有一个时钟组件,计数器应该每秒钟增加一次。但是,该值不增加超过1。
我有点像: 设置状态仍然是异步,那么等待这个调用完成的最佳方法是什么? 似乎不像那样接受回调。 在上面,我们希望按顺序运行每个setwhater调用。这是否意味着我们需要设置许多不同的useEffect挂钩来复制这种行为?
我正在React中使用useState钩子,状态将不会在