React笔记——核心概念:12.React哲学

本文目的:通过React构建一个可搜索的产品数据表格,来更深刻地领会React哲学。

1、从设计稿开始

  • 效果图:

  • JSON API返回以下数据:

2、第一步:将设计好的 UI 划分为组件层级

  • 首先,在设计稿上圈出每个组件(以及组件的子组件),并以合适的名称命名。
  • 如何确定将哪些组件划分到一个组件中?
    • 可以将组件当作一种函数或者对象来考虑,根据单一功能原则来判定组件的范围。
    • 一个组件原则上只能负责一个功能。

  • 上图包含五个组件:
    • 1.橙色(FilterableProductTable):整个示例应用的整体
    • 2.蓝色(SearchBar):用户输入
    • 3.绿色(ProductTable):数据内容
    • 4.天蓝色(ProductCategoryRow):产品类别
    • 5.红色(ProductRow):产品
  • 更加清晰的层级【设计稿中被其他组件包含的子组件,在层级上应该作为其子节点】
    • FilterableProductTable
      • SearchBar
      • ProductTable
        • ProductCategoryRow
        • ProductRow

3、第二步:用 React 创建一个静态版本

  • 先用已有的数据模型,渲染一个不包含交互功能的UI

  • 自上而下或者自下而上构建应用

    • 自上而下
      • 先编写层级较高的组件
      • 适用于比较简单的应用
    • 自下而上
      • 从最基本的组件开始编写
      • 便于大型项目为低层组件编写测试
  • 代码:

  • React 单向数据流(也叫单向绑定)的思想使得组件模块化,易于快速开发。

4、第三步:确定UI state的最小(且完整)表示

  • 目的:找出应用所需的state的最小表示,并根据需要计算出其他所有数据
    • 关键:DRY【Don’t Repeat Yourself】
  • 如何检查数据是否属于state?
    • 该数据是否是由父组件通过 props 传递而来的?如果是,那它应该不是 state。
    • 该数据是否随时间的推移而保持不变?如果是,那它应该也不是 state。
    • 你能否根据其他 state 或 props 计算出该数据的值?如果是,那它也不是 state。
  • 示例应用数据分析:
    • 1.包含所有产品的原始列表
      • 不是state:包含所有产品的原始列表是经由 props 传入的
    • 2.搜索关键词
      • 是state:随时间会发生改变且无法由其他数据计算而来
    • 3.复选框是否选中的值
      • 是state:随时间会发生改变且无法由其他数据计算而来
    • 4.搜索筛选的产品列表
      • 不是state:结果可以由产品的原始列表根据搜索词和复选框的选择计算出来

5、第四步:确定state放置的位置

注意:React 中的数据流是单向的,并顺着组件层级从上往下传递。

  • 判断state应该放在哪个组件中?
    • 找到根据这个 state 进行渲染的所有组件。
    • 找到他们的共同所有者(common owner)组件(在组件层级上高于所有需要该 state 的组件)。
    • 该共同所有者组件或者比它层级更高的组件应该拥有该 state。
    • 如果你找不到一个合适的位置来存放该 state,就可以直接创建一个新的组件来存放该 state,并将这一新组件置于高于共同所有者组件层级的位置。
  • 分析示例应用:
    • ProductTable 需要根据 state 筛选产品列表。SearchBar 需要展示搜索词和复选框的状态。
    • 他们的共同所有者是 FilterableProductTable
    • 因此,搜索词和复选框的值应该很自然地存放在 FilterableProductTable 组件中。

 

6、第五步:添加反向数据流

  • React 通过一种比传统的双向绑定略微繁琐的方法来实现反向数据传递。

  • 代码: