【发布时间】:2021-07-28 02:28:12
【问题描述】:
即将到来的并发模式是否打破了旧的保证,即点击处理程序中的setState 更新在事件边界处同步刷新?
如果我有例如一个按钮,应该只被按下一次,一个据称的工作模式是“只是在点击处理程序中将状态设置为禁用”:
let counter = 0;
const C = () => {
const [disabled, setDisabled] = React.useState(false);
const handler = React.useCallback(
() => { setDisabled(true); counter++; },
[], // setDisabled is guaranteed to never change
);
return (<button onClick={handler} disabled={disabled}>click me</button>);
};
// Assert: `counter` can never be made >1 by clicking the button with one C
这种模式used to be guaranteed to work(至少考虑到设置 disabled-attribute 可以防止任何进一步的点击事件,这似乎是这种情况)。 biggest related question i could find 讨论了这一点,并且还展示了一个或多或少明显的替代方案(并且更容易证明它有效),即使用参考(与链接问题中的答案不同,可能是布尔参考,但同样的想法,它总是同步)。
附带问题:这些信息是最新的,还是发生了变化?毕竟已经三岁多了。它提到了“交互事件(如点击)”,其他是什么?
但是,在并发模式下,可以暂停渲染,我将其解释为“将释放 js 线程”,以允许潜在的按键或任何事件流入,并且在该阶段,额外的点击事件也可以发生,在下一次渲染禁用按钮之前。因此,是使用某种 ref 还是明确添加 ReactDOM.flushSync 的方法?
【问题讨论】:
标签: javascript reactjs