React18尝鲜
发布于 3 年前 作者 kongchao 3891 次浏览 来自 分享

前些日子React团队发布了react18的alpha版本,相信不少小伙伴都惊呼,不是17才出来不久吗,怎么又要到18。但是我们还是要不断去学习,才能跟上前端快速发展的步伐。新版兼容之前的版本,所以升级后代码改动很少,下面介绍一些新版里面的一些新特性。

安装React18 alpha

在自己的项目下面执行下面的命令,尝试之前不要忘了提交之前的代码或者备份一份:

npm install react[@alpha](/user/alpha) react-dom[@alpha](/user/alpha) 或者 yarn add react[@alpha](/user/alpha) react-dom[@alpha](/user/alpha)


新的Root api

新版通过 ReactDom.creatRoot 来创建节点对象,可以用下面的方法代替以往的方式去创建节点对象,用这种方式创建,才能在项目里面尝试新版的特性哟,否则会不生效。

const container = document.getElementById('root');
// Create a root.
const root = ReactDOM.createRoot(container);
// Render the top component to the root.
root.render(<App />);

节点自动批量重渲染

function App() {
  console.log('我渲染了');
  let [count, setCount] = useState(0);
  const handleClick=()=>{
    setCount(++count);
    setTimeout(()=>{
      setCount(++count);
      setCount(++count);
    })
  }
  return (
    <div>
      <button onClick={handleClick}>Click Me</button>
      <div>{count}</div>
    </div>
  );
}

看上面的代码,举个简单的例子,如果是以往react的版本,同步和异步里面的渲染机制是不一样的,每一次点击会打印3次"我渲染了"。但是React18里面,保证了同步和异步更新渲染机制保持一致,异步的多次setState和合并成一次更新,这就使得每一次点击只会打印2次""我渲染了。

新的Suspense组件

React18将会全面支持Suspense组件,实现组件的懒加载,只是当前的api未稳定,不建议在生产环境使用

startTransition API

React18新增的startTransition的api,用于区分非紧急状态更新。使用该api可以让你去控制哪些操作是需要立刻去渲染,哪些是可以延迟更新的。

import './App.css';
import { useState, startTransition } from "react";

function App() {
  let [result, setResult] = useState('');
  const handleChange = (e) => {
    startTransition(() => {
      setResult(e.target.value);
    });
  };
  return (
    <div>
      <input type="text" onChange={(e)=>handleChange(e)} />
      <div>{result}</div>
    </div>
  );
}

export default App;

比如上面这段代码中,输入框输入新的值,之前的更新就会中断,直到没有最新的更新才会去执行非紧急更新。想要更加详细的介绍可以到 https://github.com/reactwg/react-18/discussions/41 这篇文章中看看关于startTransition的介绍。

支持变量延迟更新

import { useState, useDeferredValue } from "react";

function App() {
  let [count, setCount] = useState(0);
  const deferredCount = useDeferredValue(count, { timeoutMs: 2000 });
  const handleClick = ()=>{
    setCount(deferredCount+1)
  }

  return (
    <div>
      <button onClick={handleClick}>Click Me</button>
      <div>{count}</div>
    </div>
  );
}

export default App;

react18使用useDeferredValue支持变量延迟更新,useDeferredValue()会返回一个延迟响应的值,该值的最长延长时间为timeoutMs。目前的用法如上面所示,只是当前该api并未稳定,后面的用法可能会改变

总结

以上就是我对于react18 alpha版本的一些尝试,总的来讲新增了一些新的api,大家如果有时间也可以自己尝试一下,期待react越来越强大。

回到顶部