React编程思想
作者:Pete Hunt
React是什么?在我看来,就是使用Javascript编写大型高性能网页应用的重要方法。在Facebook和Instagram(Facebook旗下的一款图片分享软件)上已经有所应用,且效果很好。
React出色的地方之一是它的编程思想,它指导你编写你的APP。在这篇文章中,我将带领你使用React编写出一个可以进行搜索的产品数据列表。
开始前的假设
想象我们已经有了一个JSON类型的API并且有一个来自设计师的原型。从下面的原型来看,我们的设计师显然不是很专业:
我们的JSON API返回一些如下所示的数据:
[
{category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
{category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
{category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
{category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
{category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
{category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];
第一步,将UI分解为组件体系
首先,你可能会在原型的每个组件(和子组件)周围画上盒子并命名这些盒子。如果你和一个设计师共事,那么你可能早已完成此项工作,所以直接去告诉他们吧。他们Photoshop的图层命名可能以你的组件名字结尾!
但是怎样设计一个组件呢?和你创建新函数或对象的原理相同,这些原理统称为单一职责原则
,它的意思是一个组件仅仅只做一件事。如果组件的规模不断扩大,它应该被分解成为更小的子组件。
如果你经常显示一个JSON数据模型给用户,你会发现如果你的模型构造得恰到好处的话,你的UI(你的组件结构)将会很好的进行映射。因为UI和数据模型倾向于一致的信息结构,将你的UI分解成组件会很无聊。只需要按照你的数据模型进行分解就行了,每个组件只表示数据模型的一部分。
在我们简单的APP中,你将会看到我们有五个组件。我已经用斜体指出了每个组件所要表示的信息。
- FilterableProductTable (orange): 包含例子的整体结构。
- SearchBar (blue): 接收用户的输入。
- ProductTable (green): 基于用户的输入过滤和显示数据集。
- ProductCategoryRow (turquoise): 显示每个目录的标题。
- ProductRow (red): 将每个产品按列显示。
观察ProductTable
,你会发现表格的头部(包含"Name"和"Price"标签)没有自己的组件。这是一个个人喜好问题,无论哪种方法都有一定的道理。对于这个例子,我把它当做ProductTable
的一部分,因为它是ProductTable
用来渲染数据集的一部分。然而,如果头部变得复杂起来(例如,我们增加排序特性),创建它自己的ProductTableHeader
组件将无疑变得有意义。
现在我们已经在原型中定义了组件,让我们将它们整理成为一个体系。这很容易。原型中出现在别的组件中的组件在体系中作为子成员:
第二步,使用React构建一个静态的版本
现在你已经有你的组件体系,是时候实现你的APP了。最简单的方法是编写一个没有交互,只有数据渲染的版本(译者注:即是静态版本)。最好解耦这些过程,因为编写一个静态版本需要大量的输入不需要思考,添加交互需要大量的思考不需要大量的输入。我们将一起见证为什么。
编写一个只是渲染数据模型的APP静态版本,你可能会编写一个重利用其他组件并通过props
传递数据的组件。props
是父组件传递数据给子组件的一个方式。如果你熟悉state
的概念,完全不要使用state来编写这个静态版本。state
仅仅是给交互提供的,即,数据会随着时间而改变。由于这是APP的一个静态版本,你不需要它。
你可以自上而下或自下而上编写它。即,你可以一开始就编写体系中的顶层组件(例如,以FilterableProductTable
开始)或里面较低的一个(ProductRow
)。在一些简单的例子中,通常自上而下容易一些,在不是很大型的应用中,自下而上的编写包括测试用例容易一些。
在这一步的结尾,你将会有一个可重用的渲染你自己数据模型的组件库。由于这是APP的一个静态版本,这些组件仅有render()
方法。体系顶层的组件(FilterableProductTable
)将把你的数据模型当做一个prop
。如果位于数据模型下的数据发生了改变并且你再次调用了ReactDOM.render()
,UI将会被更新。因为过程并不复杂,所以可以很容易看出UI的更新以及变化。React的单向数据流动(one-way data flow/ one-way binding)使得任何事都变得模块化、快速。
该如何执行此步骤可以参考此文档 React docs。
小插曲: props VS state
React有两种“model”数据:props
和state
。理解它们之间的区别很重要。如果你还不确定它们之间的区别,参考官方文档。
第三步,确定最小(但是是完整)描述UI的state
为了使UI变得可交互,