React 类组件转换为函数式
函数式的 React 组件更加现代,并支持有用的 hooks,现在流行把旧式的类组件转换为函数式组件。这篇文章总结了转换的一些通用的步骤和陷阱。
通用替换
定义
从
class (\w+) extends Component \{
改为
const $1: FC = () => {
- 这是没有
export和props的场景
从
(export) default class (\w+) extends Component \{
改为
$1 const $2: FC<$2Props> = () => {
- 作为第二个捕捉的单词,
$2就是组件名。 $2Props应该定义为props的接口名。
Attributes 前缀
从
this\.(state\.|props\.)?
改为
- 假设
props被统一解构。
生命周期函数
从
componentDidMount() {
改为
useEffect(() => {}, []);
componentDidUpdate也可以被转换为useEffect,并设置合适的依赖。componentWillUnmount可以转换为对应useEffect处理函数的返回函数。
State 相关语句
从
state = {
data: null,
};
改为
const [data, setData] = useState();
从
this.setState({
data,
});
改为
setData(data)
类方法
从
^(\s*)(\w+)\((\w*)\) \{
改为
$1const $2 = ($3) => {
- 这属于常规函数定义。
$1是空格,$2是方法名,$3是参数.
从
^(\s*)((\w+) = (async )?\((\w+(, )?)*\) =>)
改为
$1const $2
- 这属于箭头函数定义。
$1是空格,$2方法名之后的所有内容
类 Getter
从
^(\s*)(get) (\w+)\(\)
改为
$1const $2\u$3 = () =>
\u表示对后面捕获的单词首字母大写。- 对 getter 的调用应该在方法名后加上
()。 - 如果 getter 很简单,可以直接赋值而不用使用函数。
渲染函数
从
render() {
return (
<></>
);
}
改为
return (
<></>
);
值得关注的陷阱
命名冲突
类组件可以具有同名的 attributes 和 props,例如 this.data 和 this.props.data。
当 this.data 变为 data,另外 props 经常被解构为 const {data} = props,命名冲突 就产生了。
State 回调
通过 this.setState,我们可以设置一个回调,在 state 确实改变时进行调用,但我们需要把这种方式更新为使用更新的 state 作为依赖的 useEffect。
函数 State
如果 state 的值是函数,你需要把这个函数包裹在另一个匿名函数中,否则 hook 版本的 setState 会把这个函数视为回调。
实际上,在大多情况下,这种 state 是和渲染无关的,所以也许使用 useRef 更加合适。
这个文章展示了一些使用 RegExp 的替换,可以使类组件到函数式组件的替换简单点,另外指出了一些在这个过程中你可能会遇到的陷阱,可以特别留意下,不过当然,不同的场景会存在更多的工作要处理。
React 类组件转换为函数式的更多相关文章
- class类 和 react类组件
类的理解 1 // 创建一个person类 2 class Person { 3 /* */ 4 // 构造器方法 5 constructor(name, age) { 6 // this指向 =& ...
- 为什么需要在 React 类组件中为事件处理程序绑定this?
https://juejin.im/post/5afa6e2f6fb9a07aa2137f51 事件绑定作为回调函数参数传递给函数,丢失其上下文,执行的是默认绑定,不是隐式绑定 类声明和类表达式的主体 ...
- React函数类组件及其Hooks学习
目录 函数类组件 函数式组件和类式组件的区别: 为什么要使用函数式组件? Hooks概念及常用的Hooks 1. useState: State的Hook 语法 useState()说明: setXx ...
- React函数式组件和类组件[Dan]
一篇对Dan的 How Are Function Components Different from Classes? 一文的个人阅读总结,内容来自于此.强烈推荐阅读 Dan Abramov.的博客. ...
- React - 组件:类组件
目录: 1. 类组件有自己的状态 2. 继承React.Component-会有生命周期和this 3. 内部需要一个render函数(类组件会默认调用render方法,但不会默认添加,需要手动填写r ...
- 关于React采坑(憨批)系列---类组件(class MyCom extends React.Component--VM47:9 Uncaught TypeError: Super expression must either be null or a function, not undefined)
今天在学习React中的类组件时,突然给我报错VM47:9 Uncaught TypeError: Super expression must either be null or a function ...
- 类组件(Class component)和函数式组件(Functional component)之间有何不同
类组件不仅允许你使用更多额外的功能,如组件自身的状态和生命周期钩子,也能使组件直接访问 store 并维持状态当组件仅是接收 props,并将组件自身渲染到页面时,该组件就是一个 ‘无状态组件(sta ...
- React Native组件、生命周期及属性传值props详解
创建组件的三种方式 第一种:通过ES6的方式创建 /** * 方式一 :ES6 */ export default class HelloComponent extends Component { r ...
- React的组件模式
组件是 React 的核心,因此了解如何利用它们对于创建优秀的设计结构至关重要. 什么是组件 根据 React 官网的介绍,"组件让你可以将 UI 分割成独立的.可重用的部分,并独立管理每个 ...
- react创建组件的几种方式及其区别
react创建组件有如下几种方式 ①.函数式定义的无状态组件 ②.es5原生方式React.createClass定义的组件 ③.es6形式的extends React.Component定义的组 ...
随机推荐
- Go语言中JSON的反序列化规则
Unmarshal 解析 func Unmarshal(data []byte, v any) error Unmarshal 解析 JSON 编码的数据,并将结果存储在 v 指向的值中.如果 v 为 ...
- List取指定元素
例如: List<string> list = new List<string>(); list.Take(50).ToList();//取前50条 list.Skip(10) ...
- 两个例子带你入门 Disruptor
Disruptor 是英国外汇交易公司 LMAX 开发的一个高性能队列.很多知名开源项目里,比如 canal .log4j2. storm 都是用了 Disruptor 以提升系统性能 . 这篇文章, ...
- 关于IP我们需要知道的
IP 在这个数字世界中,互联网已成为我们生活的一部分.而在互联网的背后,网络知识如同一张巨大的蜘蛛网,将我们与世界各地的信息紧密联系在一起.其中,IP这个看似平凡的名词,却是支撑这个虚拟世界的重要基石 ...
- Vue源码学习(十五):diff算法(二)交叉比对(双指针)
好家伙, 本节来解决我们上一章留下来的问题, 新旧节点同时有儿子的情况本章继续解决 1.要做什么? 本章将解决, 1.在相同tag下子元素的替换问题 2.使用双指针进行元素替换, 实现效果如下: ...
- BABYRE
一道SMC,第一次做 主函数的伪代码,judge函数是关键函数,不过啥都没有 发现 judge 方法是判断的主要逻辑,在第 15 行时调用判断. 但是静态分析时不能生成 judge 的伪代码. 原因是 ...
- 关于Spring i18n国际化 报错No message found under code * for locale 'zh_CN'.的解决方案
第一步 创建资源文件 国际化文件命名格式:基本名称 _ 语言 _ 国家.properties 这里我建了两个配置文件,一个是zh_CN中文的,一个是en_GB英文的,然后在里面随便写点测试文本语句 第 ...
- CF1881C Perfect Square 题解
思路 简单滴很,对于每一组 \((i,j)\) 找出其对应的三个点,减一减就完了. 对应的点是哪三个呢?显然是 \((n-i+1,n-j+1)\),\((j,n-i+1)\) 以及 \((i,n-j+ ...
- Django的staticfiles库
staticfiles 库是 Django 提供的一个用于管理静态文件的库,它提供了一些工具和函数来帮助开发者在 Django 应用程序中管理和提供静态文件服务. 在 Django 应用程序中,静态文 ...
- JavaWeb项目练习(学生选课管理系统)一
打算做一个选课管理系统,作为期末的复习. 上需求 2.1 页面要求 (1)系统可以通过浏览器直接访问:(1分) (2)各个功能页面整体风格统一:(2分) (3)首页为用户登录页面,管理员.教师.学生三 ...