React | 类组件 之 关注点分离困难

关注点分离困难

拗口的名词

在react中的关注点关注啥?

  • 状态管理:管理组件的内部状态,例如表单输入、组件显示状态等。
  • 生命周期管理:处理组件的挂载、更新、卸载等生命周期事件。
  • UI 渲染逻辑:定义组件的UI结构和展示方式。
  • 副作用处理:处理与组件状态无关的逻辑,例如数据获取、订阅事件等。

所以react中的关注点就是我们熟悉的:状态管理、生命周期管理、UI 渲染逻辑、副作用处理

分离困难?

组件不清晰、难理解、难维护就是我们经常想吐槽的困难~

1、定义总结:

关注点分离困难

指的是在类组件中,状态管理、生命周期管理和 UI 渲染逻辑交织在一起,难以清晰地分离和管理这些不同关注点的逻辑。 导致代码结构不清晰、难理解、难维护等问题。

2、定义清晰了,上案例:

类组件实现:

import React, { Component } from 'react';

class Counter extends Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }

  componentDidMount() {
    console.log('Component did mount');
    this.timerId = setInterval(() => {
      this.setState((prevState) => ({ count: prevState.count + 1 }));
    }, 1000);
  }

  componentDidUpdate(prevProps, prevState) {
    console.log('Component did update');
    if (prevState.count !== this.state.count) {
      console.log('Count updated:', this.state.count);
    }
  }

  componentWillUnmount() {
    console.log('Component will unmount');
    clearInterval(this.timerId);
  }

  render() {
    return <div>Count: {this.state.count}</div>;
  }
}

export default Counter;

在componentDidMount 中启动定时器

在componentDidUpdate 中检查状态更新

在componentWillUnmount 中清除定时器等

包含componentDidMount、componentDidUpdate 和 componentWillUnmount 三个生命周期方法,相对分散。


再来对比看下函数组件实现:

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

const Counter = () => {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log('Component did mount');
    const timerId = setInterval(() => {
      setCount((prevCount) => prevCount + 1);
    }, 1000);
    return () => {
      console.log('Component will unmount');
      clearInterval(timerId);
    };
  }, []);

  useEffect(() => {
    console.log('Component did update',count);
  }, [count]);

  return <div>Count: {count}</div>;
};

export default Counter;

useEffect Hook 实现类组件中对应的生命周期逻辑

useEffect Hook 的第二个参数控制副作用的执行,即更新时机。

逻辑清晰 -> 组件关注点集中 -> 代码结构简洁易读。(类似vue2到vue3的进阶,看来这些框架干的事几乎都差不多)


以上内容皆服务于: 今天只学一个知识点:hooks