🔥 React Conf 2021 到底讲了什么?

4,218 阅读3分钟

看完 React Donf 2021 回放视频,最大的感触就是震撼!!

那么本次会议的重点是什么呢?

  1. 🤙 Suspense
  2. 🤙 并发特性
  3. 🤙 服务器组件
  4. 🤙 自动批处理

🤘 Suspense 功能

首先为什么需要这个功能?官方在数以万计的组件当中寻找到了一些代码的共同点,如下:

function Test() {
  const [ data, isLading ] = useData("xxxxxxxxxxx");

  if (isLading) {
    return <>Lading....</>;
  }

  return (
    <div>
      {data}
      {/* TODO */}
    </div>
  );
}

那这样看来在如此情况下的代码,必然可以抽离出来,如此就有了 Suspense 这个功能! 例如:

const Lading = lazy(() => import("./Lading"));
function App() {
  return (
    <div>
      <Suspense fallback={<Lading />}>
        <Test />
      </Suspense>
    </div>
  );
}

那在这种情况下,当Test 组件中的数据还没有加载完毕时,就会显示 Lading 组件

如果你觉得Suspense 就这么点功能!那这次的大会就白开了!其实关于它用法很多,例如:

  1. 🤙 动态的加载代码拆分的 JS 包!或者加载别的异步资源,提高客户端的渲染能力!
  2. 🤙 构建服务端渲染的组件,就是基于Suspense功能的!

**注意:本质上,Suspense 功能可以极大的改善数据的加载过程。 **

🤘 并发特性

起因:由于在移动端是存在多线程的,RN 的团队就提出了并发特性这个概念并引进了 React中。以此来实现两个平台的统一!

涉及API:

  1. 🤙 starTransition
  2. 🤙 useTransition
  3. 🤙 useDeferredValue

咱们直接废话不多说直接上对比图:

同步模式:

2021-12-09 13.57.12.gif

并发:

2021-12-09 13.59.34.gif

偷偷告诉你,我在看的时候没有把演示的 demo 录上,所以就使用了 react-18 讨论中的图

注意: 目前的并发特性是 React 18 的最重要的基础,以后就不存在 并发模式了,只有并发特性!(不会自动开启并发特性,需要使用API手动开启!)

🤘 服务器组件

服务器组件是基于 Suspense 功能实现的。可以极大的提高 服务端渲染时首页的加载速度!

例如:在服务端渲染页面时,如果页面有的部分内容太大,就可以使用 Suspense 先渲染 Lading(如图一)。之后再渲染内容较多的部分(如图二)。

图一: image.png

代码:

<Suspense fallback={<Spinner />}>
  <Comments />
</Suspense>;

图二:

image.png

注意: 服务器组件目前仍在开发中,所以还不存在于React 18 的稳定版本中!

🤘 自动批处理

这个功能也相当的重要,其实 翻译成行话就是 自动合并更新 !例如:

class test extends Component {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }
  handleClick = () => {
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 1 });
    this.setState({ count: this.state.count + 1 });
  };
  render() {
    return (
      <>
        {this.state.count}
        <button onClick={this.handleClick}> Add</button>
      </>
    );
  }
}

export default test;

例如在handleClick 方法中 我们调用了 4次 setState,其实在更新队列中会合并为一个。用于减少页面的渲染。

还记得 React 最有名的面试题题吗? setState 什么时候是同步更新,什么时候是异步更新?

现在用了 React 18,估计 这个问题就问不成了! 因为 在React 18 中,无论 setState 写在 原生事件、setTimeout、Promise.then 中,都支持 更新合并!!

例如:

function test() {
  const [count, setCount] = useState(0);
  const [name, setName] = useState("");
  const butDOM = useRef(null);
  setTimeout(() => {
    setCount(count + 1);
    setName("setTimeout");
  }, 1000);

  new Promise((resolve) => {
    resolve("success");
  }).then(() => {
    setCount(count + 1);
    setName("Promise");
  });
  butDOM.current?.addEventListener("click", function () {
    setCount(count + 1);
    setName("addEventListener");
  });

  return (
    <>
      <p>{name}</p>
      <p>{count}</p>
      <button ref={butDOM}>Add</button>
    </>
  );
}

以上就是 React Conf 2021 我觉得比较重要的内容!