前言

上一节实战中,我们使用 class component 创建了一个表示天气信息的组件。
这一节我们将创建更多组件,并将所有组件组合。

封装组件

上一节的实例代码可以进行如下修改:

  1. import React from 'react';
  2. import './style.css';
  3. class RealTime extends React.Component {
  4. render() {
  5. return (
  6. <div className="RealTime">
  7. <div className="temp">-2°</div>
  8. <div className="weather">晴</div>
  9. <div className="wind">北风 2级</div>
  10. <div className="humidity">湿度 66%</div>
  11. </div>
  12. );
  13. }
  14. }
  15. const App = () => (
  16. <div>
  17. <RealTime />
  18. </div>
  19. );
  20. export default App;

我们将 RealTime 相关的内容抽离了出来单独封装了一个组件,这样的复用性更强。
需要注意的是,组件调用时如:<RealTime></<RealTime> 可简写为自闭合组件 <RealTime />

编写更多组件

我们再来实现一个未来1天内温度分布表组件。

  1. class Details extends React.Component {
  2. render() {
  3. return (
  4. <div className="Details">
  5. <div className="time">01:00</div>
  6. <div className="weather">阴</div>
  7. <div className="temperature">-1°</div>
  8. </div>
  9. );
  10. }
  11. }
  12. class WeatherDetails extends React.Component {
  13. render() {
  14. return (
  15. <div className="WeatherDetails">
  16. <Details />
  17. <Details />
  18. <Details />
  19. <Details />
  20. <Details />
  21. <Details />
  22. <Details />
  23. <Details />
  24. </div>
  25. );
  26. }
  27. }

组件的组合、嵌套和组件树 - 图1

在写一个展示各项生活指数的组件

  1. class Indexes extends React.Component {
  2. render() {
  3. const Index = () => (
  4. <div className="Index">
  5. <div className="level">适宜</div>
  6. <div className="name">洗车指数</div>
  7. </div>
  8. );
  9. return (
  10. <div className="Indexes">
  11. <Index />
  12. <Index />
  13. <Index />
  14. <Index />
  15. <Index />
  16. <Index />
  17. </div>
  18. );
  19. }
  20. }

总结

组件和组件可以结合在一起,组件的内部又可以使用其他组件,这样组合嵌套后,就构成了一个所谓的组件树。

之前的实战中 App 内使用了三个组件 <RealTime /> <WeatherDetails /> <Indexes />

其中 <WeatherDetails /> 又使用了组件 <Details /><Indexes /> 内部使用了函数式组件 <Index />

我们希望设计组件时能保证组件的专一性即:一个组件只专注做一件事

一个复杂的功能如果可以拆分成等多个小功能,那就可以将每个小功能封装成一个组件,然后通过组件的嵌套/组合实现复杂功能。

当然也不是拆分的越细、颗粒度越小越好,能控制在一个可控的范围内即可。