React 中的组件类型(总计)?

Types of Components in React (in Total)?

因为我正在学习“React”,所以我知道 React 中有两种类型的组件:

  1. Class基
  2. 功能正常

现在,在进行一些采访时,我遇到了以下问题:

  1. 智能组件
  2. 哑组件
  3. 纯成分
  4. 不纯成分
  5. 高阶分量

此外...

  1. 聪明与愚蠢的组件
  2. 纯与不纯成分
  3. 常规与纯组件

现在,我更糊涂了,因为我只知道只有两种类型的组件。那么有人可以帮助我吗 - 这些其他组件是什么,或者如果它们也是 React 的一部分,in total what are the different types of Components in React?

一个 class 组件是一个 class 带有渲染方法,React 将调用该渲染方法来渲染 jsx,而功能组件是一个函数,React 将调用传递道具给它和函数将 return jsx 用于 React 渲染。

智能组件是有逻辑的组件,如果是class那么组件可能有本地状态(this.state),如果是智能功能组件那么组件可能有一些钩子(const [state,setState]=useState(initialState)).

笨组件只根据传入的 props 生成 jsx,没有任何逻辑,所以笨 class 组件只有渲染方法,笨功能组件没有钩子。

一个纯组件只有在传递给它的 props 发生变化时才会重新渲染,但是当纯组件有 hooks 它可以重新渲染,即使 props 没有改变(比如当你在组件中使用 useSelector 时)但是从技术上讲,该组件有副作用并且不纯净。纯 class 组件扩展 React.PureComponent 而纯函数组件不存在,您可以将函数组件传递给 React.memo 但 React.memo(FunctionalComponent) 的结果不是函数。因此,您可以使用备忘录 HOC 从功能组件创建新的纯组件,但纯组件永远不是函数。

非纯组件可以是具有副作用的组件,例如在 onMount 方法中调用 class 组件中的 api 方法,或者使用 useEffect 在功能组件中调用效果。具有任何类型的自身状态(useState 或 this.state)的组件也不是纯粹的。

高阶组件类似于 React-Redux connect 和 React memo。它是一个接收组件和 return 新组件的函数。

以下是一些示例(没有 class 个组件):

//fake api that resolves later
const api = () =>
  new Promise((resolve) =>
    setTimeout(() => resolve([1, 2, 3]), 2000)
  );

//HOC using props.loading to display loading
const withLoading = (Component) => (props) =>
  props.loading ? 'loading' : <Component {...props} />;
//pure component will only re render when props change
//  also dumb component as it only returns jsx
//  and using HOC React.memo to create List
const List = React.memo(function List({ data }) {
  return <pre>{JSON.stringify(data, undefined, 2)}</pre>;
});
//this will display loading using the withLoading HOC
const LoadingList = withLoading(List);
//functional impure component (has side effect fetching data and local state)
const App = () => {
  //smart component as App uses state and does more than only return jsx
  const [data, setData] = React.useState({ loading: true });
  React.useEffect(() => {
    api().then((data) =>
      setData({
        loading: false,
        data,
      })
    );
  });
  return <LoadingList {...data} />;
};

ReactDOM.render(<App />, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>