react 理念(Thinking in React)

React的理念:

在我们的理念中,React 最初的目的是使用 JavaScript 创建大型的,快速响应的网络应用。它在我们的 Facebook 和 Instagram 中已经实践的非常好了。

然后我来写一个稍微复杂一点的组件吧,来亲自感受一下react的理念:)

我们先从设计师给我们的原型图开始吧:


image

我们最终就是要弄一个这个东西出来,大概就是一个搜索框,会根据搜索框的内容和单选框的值来筛选结果,然后显示在下面的表格当中。

这个表格的数据假设我们已经有一个接口可以给我们返回数据了,这个接口给我们返回JSON格式的数据,比如:

[
  {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"}
];

好了,样式和数据都有了,现在到我们来实现了,我们先看看这个大组件的结构。
原型图的设计师们可能已经帮我们划分好了层次结构,他们的photoshop图层的名称可能就是我们所需要划分的组件的名称:)。

那么我们还是需要知道如何划分组件,看看官网的原话:

   但你如何知道哪一部分应该成为一个组件?想想在编写代码时你在什么情况下需要新建一个函数或对象,思考方式是一样的。例如单一功能原则,在理想状况下,一个组件应该只做一件事情。如果这个组件功能不断丰富,它应该被分成更小的组件。
   既然你经常向用户展示 JSON 数据模型,你会发现,如果你的模型构建正确,你的 UI (以及你的组件结构)会被很好的映射。这是因为 UI 和数据模型往往遵循着相同的信息架构,这意味着将 UI 划分成组件的工作往往是很容易的。只要把它划分成能准确表示你数据模型的一部分的组件就可以。

那么我们分析的结果就是:


  1. FilterableProductTable(橙色):包含所有组件,最大的一个组件
    1. SearchBar(蓝色):搜索框以及单选框
    2. ProductTable (绿色):产品列表,按照产品的类别排列产品
      1. ProductCategoryRow(蓝色):产品类别(行)
      2. ProductRow (红色):产品详情(行)

层级代表了组件的包含关系,这样一分解,就感觉每个组件都很简单,非常好写,我们先写一下静态版本的这些组件,就是不存在状态(state)。我们的渲染需要的数据都通过props传递,每个组件也只有render方法。

我们之前说过react的数据流是从上到下的,是单向数据流(单向绑定)。

codepen代码这是官方实现的代码,我也跟着实现了一遍,发现它有一个地方写的不是很好,就是ProductTable展示产品的时候,因为传入的数据是已经按类别排列好了的,所以它按类别展示部分的逻辑就写的很简单,以致于如果传入的数据不是按顺序排列的话,就会出现错误。

但是我想他这么写也是有一定道理的,因为我们的数据是从后台通过接口得到的,所以可以在后台先把数据处理好,然后传过来,让前端的逻辑尽量简单。


静态的组件完成之后,我们已经可以通过修改传入的商品数据来让商品列表发生变化,来看看我们的UI界面是如何变化的。

接下来我们需要根据输入框和单选框的值来筛选数据,然后显示出来,要做到这个功能,我们需要给输入框和单选框加入state,就像我们之前在表单那一小节中说的那样,让它们变成一个受控组件,但是这样就够了吗?

我们仔细想想这个逻辑,首先我们给SearchBar输入我们想要搜索的名称,然后SearchBar的状态改变,但是我们的最终的结果应该是ProductTable作出相应的变化,所以我们可以看出来,ProductTable是需要SearchBar的状态的,那么我们需要干嘛?

状态提升

对,我们需要把SearchBar的状态提升到SearchBarProductTable的父组件上。

接下来就没有什么难度了,大家只要知道了状态提升这招,这个逻辑就很好实现了。

最后给出官方的codepen

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容