美文网首页
2022-05-21 React18 异步渲染

2022-05-21 React18 异步渲染

作者: FConfidence | 来源:发表于2022-05-21 00:21 被阅读0次
import React, { useCallback, useState } from 'react';
import SendButton from './SendButton';

export default function AsyncHook() {
  const [a, setA] = useState(0);
  const async = () => {
    setTimeout(() => {
      setA((c) => c + 1);
      window.console.log(a);
      setA((c) => c + 1);
      window.console.log(a);
      setA((c) => c + 1);
      window.console.log(a);
      // react17: 结果加3, renderTime 3次
    }, 0);
  };

  const async2 = () => {
    setTimeout(() => {
      setA(a + 1);
      window.console.log(a);
      setA(a + 1);
      window.console.log(a);
      setA(a + 1);
      window.console.log(a);
    }, 0);

    // react17: 结果+1, renderTime 调用2次
  };

  const sync = () => {
    setA((c) => c + 1);
    window.console.log(a);
    setA((c) => c + 1);
    window.console.log(a);
    setA((c) => c + 1);
    window.console.log(a);
    // react17: 结果+3, renderTime 调用1次
  };

  const sync2 = () => {
    setA(a + 1);
    window.console.log(a);
    setA(a + 1);
    window.console.log(a);
    setA(a + 1);
    window.console.log(a);
    // react17: 结果+1, render time调用一次
    // React18: 结果+1, render time调用一次 (上述几个demo表现与这个一致)
  };

  window.console.log('render times', a);

  const [text, setText] = useState('');

  const onClick = useCallback(() => {
    window.console.log('send: ', text);
  }, []);

  const onTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setText(e.target.value);
  };

  return (
    <div>
      <div>{a}</div>
      <button onClick={async} className="bg-teal-300">
        async
      </button>
      <button onClick={async2} className="bg-teal-300">
        async2
      </button>
      <button onClick={sync}>sync</button>
      <button onClick={sync2}>sync2</button>
      <hr />
      <input type="text" onChange={onTextChange} />
      <SendButton onSendMessage={onClick} />
    </div>
  );
}
/** 在React17中结果是一致的
 * 异步async render times会调用三次 结果+3
 * 异步async2 render times会调用2次, 结果加1

 * 同步: render times只调用一次, 结果+3
 * 同步: render times只调用一次, sync2 结果+1
 *
 * 结果都是增加三次
 *
 * react18中,
 * 异步 render times会调用一次
 * 同步: render times只调用一次
 * 行为保持了一致
 */

相关文章

  • 2022-05-21 React18 异步渲染

  • IOS - UIView绘制流程 (displayLayer)(

    性能优化之 UI渲染优化 - 异步渲染 使用displayLayer进行异步绘制

  • 异步渲染1

    异步渲染优化篇章 一.为什么需要异步渲染,异步渲染有什么好处?? 我们添加到项目或从服务端获取的图片格式基本上都为...

  • iOS的异步绘制--YYAsyncLayer源码分析

    iOS的异步渲染 最近看了YYAsyncLayer在这里总结一下。YYAsyncLayer是整个YYKit异步渲染...

  • 2022-07-04

    iOS中的异步渲染探究,以及基于异步渲染的高度自定富文本框架构建 此前一直犹豫要不要写个自己的异步渲染库,最近赶上...

  • 2018-07-15 Vue源码解析阅读笔记

    Vue的异步组件 异步组件实现的本质是 2 次渲染,除了 0 delay 的高级异步组件第一次直接渲染成 load...

  • iOS 异步渲染

    前言 异步绘制,就是可以在子线程把需要绘制的图形,提前在子线程处理好。将准备好的图像数据直接返给主线程使用,这样可...

  • vue异步渲染

    vue是组件级更新,当数据更改一次组件就要重新渲染一次,性能不高,为了防止数据一更新就更新组件,所以做了个异步更新...

  • react18已经来了

    react18他来了 react17都还没捂热,react18突然就来了,没有一点点防备,react官网已经放出r...

  • 一个iOS流畅性优化工具

    简介 LNAsyncKit是一个异步渲染工具,它提供了便捷的方法帮助你将多个元素(Element)异步渲染到一张图...

网友评论

      本文标题:2022-05-21 React18 异步渲染

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