首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要对输出进行解释。需要理解钩子中的顺序& re呈现工作

需要对输出进行解释。需要理解钩子中的顺序& re呈现工作
EN

Stack Overflow用户
提问于 2019-05-23 16:59:30
回答 1查看 62关注 0票数 0

我无法理解在调用set(state)时效果和重新呈现工作的顺序。我知道,默认情况下,每个呈现效果都会运行。但在这种情况下,无法应用相同的原则来匹配生成的输出。

代码语言:javascript
运行
复制
function Example() {
  const [count, setCount] = useState(0);
  const [flag, setFlag] = useState(false);

  console.log("<===rendering===>");

  useEffect(() => {
    console.log("Running Effects")
    Promise.resolve(1)
      .then(() => {
        console.log("BEFORE SET flag", flag);
        setFlag(true);
        console.log("AFTER SET flag", flag);
        console.log("flag4 SET count", count);
        setCount(20);
        console.log("AFTER SET count", count);
      })
  }, [flag, count]);


  return (
    <div>
      Hello
    </div>
  );
}

输出

  1. <===rendering===>
  2. 运行效果
  3. 设置标志为false之前
  4. <===rendering===>
  5. 后设置标志为false
  6. 设置前计数为0
  7. 运行效果
  8. <===rendering===>
  9. 设置后计数0
  10. 在SET标志true之前
  11. 运行效果
  12. <===rendering===>
  13. 在SET标志true之后
  14. 设置前计数为0
  15. 设置后计数0
  16. 在SET标志true之前
  17. 在SET标志true之后
  18. 在设定前计数20
  19. 设置后计数20
EN

回答 1

Stack Overflow用户

发布于 2019-05-23 20:25:51

好的,下面是所发生的事情:Promise.resolve().then基本上是将然后块的执行排队到效应阶段之后,这就是为什么在本例中,setState立即触发一个新的呈现,然后,在下一个效果开始之前,然后继续执行then块。

我修改了您的代码,以帮助您更好地理解console.log属于每个呈现。

https://codesandbox.io/s/weathered-lake-heh9j

第一次呈现启动

代码语言:javascript
运行
复制
#1 "<===rendering===>" false 0

第一次呈现结束呈现

第一次呈现效果启动

代码语言:javascript
运行
复制
#1 "Running Effects" false 0

第一次呈现效果结束

第一个呈现Promise.then块启动

代码语言:javascript
运行
复制
#1 "BEFORE SET flag" false 0

第一次呈现setCount立即调用下一次呈现,因为我们已经完成了效果阶段第二次呈现启动

代码语言:javascript
运行
复制
#2 "<===rendering===>" true 0

第二次呈现结束呈现

第一个呈现Promise.then块继续

代码语言:javascript
运行
复制
#1 "AFTER SET flag" false 0
#1 "BEFORE SET count" false 0

第一次呈现setCount立即调用第三次呈现,因为我们已经完成了效果阶段,但是在呈现反应之前,第二次呈现挂起的效果

第二呈现效果启动

代码语言:javascript
运行
复制
#2 "Running Effects" true 0

第二呈现效果结束

第三次呈现启动

代码语言:javascript
运行
复制
#3 "<===rendering===>" true 20

第三次呈现结束呈现

第一个呈现Promise.then块继续

代码语言:javascript
运行
复制
#1 "AFTER SET count" false 0

第一次呈现Promise.then块结束=>首先呈现所有已完成的

第二个呈现Promise.then块启动

代码语言:javascript
运行
复制
#2 "BEFORE SET flag" true 0

第二次呈现setCount立即调用第四次呈现,因为我们已经完成了效果阶段,但是在呈现之前,第三次呈现挂起的效果会做出反应。

第三个呈现效果启动

代码语言:javascript
运行
复制
#3 "Running Effects" true 20

第三次渲染效果结束

第四次呈现启动

代码语言:javascript
运行
复制
#4 "<===rendering===>" true 20

第四次呈现结束,由于计数和标志没有更改,因此没有产生效果。

第二次呈现Promise.then块继续

代码语言:javascript
运行
复制
#2 "AFTER SET flag" true 0
#2 "BEFORE SET count" true 0
#2 "AFTER SET count" true 0

第二次呈现Promise.then块结束

第三次呈现Promise.then块启动

代码语言:javascript
运行
复制
#3 "BEFORE SET flag" true 20
#3 "AFTER SET flag" true 20
#3 "BEFORE SET count" true 20
#3 "AFTER SET count" true 20

第三次呈现Promise.then块结束

下面的修改示例可能有助于进一步了解react所做的事情。

https://codesandbox.io/s/competent-wozniak-syr0s

请注意,当您单击set标志true按钮时,不会触发任何呈现,因为react比较了新的和以前的状态,可能决定不呈现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56279911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档