React类式组件和函数式组件的区别?

February 3, 2023

React 类式组件和函数式组件的区别有哪些呢?

主要要以下几个区别:

(1)语法不同、设计思想不同

(2)生命周期、状态变量

(3)复用性:

(4)优缺点

语法不同、设计思想不同

函数式组件是函数式编程思想,而类组件是面向对象编程思想。面向对象编程将属性和方法封装起来,屏蔽很多细节,不利于测试。

生命周期、状态变量

类式组件:使用 state 对象定义状态变量,有诸如 componmentDidMount、shouldComponentUpdate 等生命周期钩子函数;

函数式组件:没有 this,使用一系列的内置 hooks 实现对应的功能,比如使用 useState 创建状态变量,使用 useEffect 实现类似于 componmentDidMount、shouldComponentUpdate 等生命周期钩子函数的功能。

复用性

类式组件:使用 hoc(高阶组件)、render propss 实现组件的逻辑复用、拓展组件的功能。

函数式组件:使用自定义 hooks 实现组件的逻辑复用。

优缺点

函数式组件:

优点:

  • 相对于类式组件,一般情况而言,代码量更少,代码更简洁,可读性更强;
  • 更易于拆分组件和测试;

缺点:

  • 在业务逻辑巨复杂,状态依赖关系错乱的情况下,使用 useEffect、useMemo 等 hooks,对其依赖项数组的思考为开发者带来了更大的心智负担;
  • 不具备处理错误边界等业务情况的 hooks;

类式组件:

优点:

  • 相功能完备,具有 componentDidsCatch、getDerivedStateFromError 等钩子函数处理边界错误;

缺点:

  • 在复用性上,hoc 组件等会出现诸如嵌套地狱、重名 props 被覆盖、难以拆分和测试等问题;

总结

类式组件和函数式组件各有其优点,关键是看自己的需求是什么;如果你开发的业务逻辑和状态并不复杂,那么类式组件可能会更合适;

但是如果你要处理错误边界或者是业务逻辑巨复杂的情况,那么类式组件更合适;

其实无论是什么技术开发,衡量代码是否优雅的标准无非是开发效率(复用性、易用性)、代码性能、是否易于测试和维护;当然三者常常不可兼得,关键看自己需求是什么;