在升级 React18 版本时,需要注意一些细节,否则很容易引起线上问题。

1. 升级 React 版本

先升级 React 相关依赖:

# 基础库升级
pnpm add react@18.2.0 react-dom@18.2.0
# 类型升级
pnpm add @types/react@18.2.20 @types/react-dom@18.2.0 -D

注意:升级 @types/react 版本时,需要关注当前项目中使用的 typescript 版本,找到匹配的 @types/react 版本,具体的对应关系可以通过下面的命令查看:

npm info @types/react

可以在输出结果中找到适配当前项目 typescript 版本的 @types/react 版本,如果确定要升级到指定的 @types/react 版本,也可以反过来调整 typescript 的版本。

2. children 不再是默认属性,需要显式声明

import React from 'react'
 
interface ComponentNameProps {
    children?: React.ReactNode
}
 
export default function ComponentName(props: ComponentNameProps) {
    return (
        <>
            {props.children}
        
    )
}

3. useEffect 回调函数的返回值必须是一个同步函数

如果在 useEffect 的回调中返回了异步函数,将会触发 react-dom 报错:destroy is not a function。

useEffect(()=>{
  return fetch('https://xxx.com/yyy/zzz')
})

原因:React 会将 useEffect 函数体内部的 return 值作为销毁函数执行,但它必须是一个同步函数。