关于React的一些记录

143 阅读4分钟

1. 是否升级版本

新的React版本对生命周期有比较大的改动,那么对于老项目,代码量很大,到底该不该升级呢? 如果老项目改动起来非常麻烦,而且回归的点特别多的话,在React17之前,老的生命周期没有移除,可以继续使用,只是需要在老的生命周期前面加上UNSAFE前缀 npx react-codemod rename-unsafe-lifecycles这是升级到React16.x比较方便的方法,但是React17开始就移除了一些老的生命周期了。

2. React 新版本带来的新技能

2.1 Fragments/Portals/Strict Mode

  • Fragments:等价于空标签<>,用于包裹React元素,作为顶级元素使用的;
  • Portals:React Portals是React 16中引入的一个特性,它允许开发者在React应用中将组件渲染到DOM树中的任何位置,而不仅仅是在组件层级中;
  • React Strict Mode: React Strict Mode是React 16.3中引入的一个特性,它是一种工具,可以帮助开发者发现潜在的问题,同时也可以帮助React更好地优化应用程序。

React Strict Mode可以用来包裹整个应用程序,从而启用一些额外的检查和警告。 具体来说,React Strict Mode会在开发环境中进行以下操作:

  1. 检查不安全的生命周期方法:React Strict Mode会检查使用了不安全的生命周期方法的组件,并在控制台中打印出警告信息。这可以帮助开发者发现可能导致问题的代码,并且可以更好地了解React的生命周期。
  2. 检查意外的副作用:React Strict Mode会在开发环境中对应用程序进行两次渲染,并比较两次渲染之间的输出。如果输出有所不同,React Strict Mode会在控制台中打印出警告信息,提示开发者进行排查。这可以帮助开发者发现可能会导致意外副作用的代码。
  3. 检查过时的API使用:React Strict Mode会检查应用程序中使用了过时的React API,并在控制台中打印出警告信息。这可以帮助开发者更新代码,以使用更新的React API。

除了上述检查之外,React Strict Mode还会在一些其他方面对应用程序进行优化,例如禁用一些不安全的生命周期方法,优化合成事件的行为等等。

使用React Strict Mode非常简单,只需要在根组件中使用<React.StrictMode>标签包裹应用程序即可。例如:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

在这个示例中,我们将应用程序包裹在<React.StrictMode>标签中。这样,在开发环境中,React会自动启用React Strict Mode,并对应用程序进行额外的检查和优化。

2.2 React Concurrent Mode

React Concurrent Mode是React的一个实验性特性,旨在改进React的并发渲染能力,提高应用程序的性能和用户体验。

传统的React渲染是单线程的,也就是说,每个组件的渲染都是按顺序进行的,如果某个组件的渲染时间过长,就会阻塞整个应用程序的渲染。这会导致应用程序的性能变差,用户体验变得不流畅。

React Concurrent Mode引入了一些新的特性和API,旨在改善这个问题。具体来说,React Concurrent Mode提供了以下几个方面的改进:

  1. 异步渲染:React Concurrent Mode支持异步渲染,也就是说,React可以将组件的渲染工作分解成小的任务,并按优先级顺序处理这些任务,以达到更快的渲染速度。这个特性可以显著提高应用程序的性能和用户体验。
  2. 调度器:React Concurrent Mode引入了一个新的调度器,它可以根据任务的优先级和剩余时间等因素,决定下一个任务应该执行哪个。这个特性可以帮助React更加智能地处理任务,提高渲染效率。
  3. Suspense API:React Concurrent Mode还引入了一个新的API叫做Suspense,它可以帮助开发者更好地处理异步数据的加载和错误处理。使用Suspense API,开发者可以更加方便地在应用程序中处理异步数据,同时还可以提供更好的错误处理体验。

需要注意的是,React Concurrent Mode是一个实验性特性,目前还在开发和测试中,它可能会在未来的React版本中发生变化。如果您想使用React Concurrent Mode,请先仔细阅读相关文档,并在测试环境中进行尝试。

下面是一个使用React Concurrent Mode的示例:

import React, { useState, useEffect } from 'react';

function App() {
  const [data, setData] = useState(null);

  useEffect(() => {
    async function fetchData() {
      const result = await fetch('/api/data');
      setData(result);
    }

    fetchData();
  }, []);

  return (
    <React.ConcurrentMode>
      {data ? <MyComponent data={data} /> : <Loading />}
    </React.ConcurrentMode>
  );
}

在这个示例中,我们使用了React Concurrent Mode来处理异步数据的加载。当数据加载完成后,我们渲染了一个名为MyComponent的组件,并将数据传递给它。如果数据还没有加载完成,我们会渲染一个名为Loading的组件来提示用户数据正在加载中。

image.png

3. 清理缓存的命令

yarn cache clean