美文网首页
useState批处理的坑

useState批处理的坑

作者: joyer_li | 来源:发表于2021-11-19 00:23 被阅读0次

在学习react的时,关于状态的生效时机,官方说明多个状态在同时执行的时候会被合并(批处理)。在学习hooks时,跟状态相关的useHooks也以为是同样的批处理。如下面代码:

import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';

const Demo = () => {
  const [a, setA] = useState('');
  const [b, setB] = useState('');

  useEffect(() => {
    console.log('触发更新拉');
  }, [a, b]);

  return (<span onClick={() => {
    setA(String(Math.random()));
    setB(String(Math.random()));
  }}>测试</span>);
};

ReactDOM.render(
  <Demo />,
  document.getElementById('container'),
);

再点击时会发现只触发一次,状态的set函数被批处理了。<br />

但将上面的代码改动一下:

import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';

const Demo = () => {
  const [a, setA] = useState('');
  const [b, setB] = useState('');

  useEffect(() => {
    console.log('触发更新拉');
  }, [a, b]);

  return (<span onClick={() => {
    setTimeout(() => {
      setA(String(Math.random()));
      setB(String(Math.random()));
    }, 300);
  }}>测试</span>);
};

ReactDOM.render(
  <Demo />,
  document.getElementById('container'),
);

此时点击后,会发现触发了两次更细,状态的set函数不批处理了!<br />

查阅资料后发现,这是react hooks机制的一个缺陷,会计划在react 18中修复,说明文档在这:<br />https://github.com/reactwg/react-18/discussions/21<br />
<br />根据说明文档所说,不仅仅setTimeout批处理会失效,像Promise.then函数中也会失效。

相关文章

  • useState批处理的坑

    在学习react的时,关于状态的生效时机,官方说明多个状态在同时执行的时候会被合并[https://zh-hans...

  • hooks的坑

    useState()。使用push,pop,splice等直接更改数组对象的坑 每次渲染都是独立闭包的坑 使用us...

  • React Hooks——useState的源码流程

    React Hooks——useState 源码版本 16.8 useState 流程示意图 从useState源...

  • React Hooks

    一.useState 提示: useState 最好是在最顶层调用, 组件每次渲染的 useState 数量必须...

  • 01-React-hooks-useState基本使用

    React-hooks-useState useState的基本用法 格式: 初始状态 useState的第一个参...

  • React Hooks

    一.useState hooks就是在函数组件中使用state通过useState实现的。 useState传入一...

  • useState 实现原理

    useState 熟悉hooks的都知道,最常用的useState 大概用法 简单的实现一个useState 先模...

  • React-Hooks之保存状态和生命周期

    1.保存状态(useState) useState(initialState) 的参数 initialState ...

  • hook useEffect

    useState 最简单的 useState 用法是这样的:function Counter() { var [...

  • 常用React Hooks 方法

    useState 使用状态 const [n, setN] = React.useState(0)const [u...

网友评论

      本文标题:useState批处理的坑

      本文链接:https://www.haomeiwen.com/subject/imcstrtx.html