1. 确定设计稿和数据

设计稿:

数据:

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

2. 将设计稿UI分组件层级

组件单一功能原则:

即一个组件实现一个功能。

图中,一个颜色是一种组件,按照嵌套关系,可以分为:

FilterableProductTable:

SearchBar:

ProductTable:

ProductCategoryRow

ProductRow

3. 确定需要的state值的个数

原则:

1. 值不是来自与props
2. 值不是一成不变
3. 值不能由其他state和props求得

该示例中,需要数据源的地方有:

1. 查询框的文本 // 会变化;state.filterText
2. 复选框的状态 // 会变化;state.isStock
3. 所有的产品列表数据 // 通过props传入; 无state
4. 过滤后的产品列表数据 //通过1,2,3获得; 无state

4. 确定state的位置-状态提升

通过分析state对应的值作用的范围,state应该位于所有作用区域的父组件;

才能共享state。

从功能分析,1,2的状态会影响列表展示;则其应该位于查询框和列表的父组件;

即组件FilterableProductTable中。

3的状态会影响列表分类ProductCategoryRow和列表项ProductRow,则应该放在他们的父组件;

即组件ProductTable中。

5. 添加反向数据流

即通过触发子组件的事件监听,调用父组件传递过去的函数,从而改变父组件的state的值。

因为state的状态提升,而state又是私有状态,只能通过state所处的组件的函数进行修改。

6. 从下向上编写代码

/*
* @Author: LyraLee
* @Date: 2019-11-08 09:01:58
* @LastEditTime: 2019-11-20 17:32:14
* @Description: 分类数据处理
*/
'use strict'
const products = [
{category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
{category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
{category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
{category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
{category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
{category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
];
function ProductRow(props) {
const product = props.product;
const { name } = product;
const renderName = !product.stocked ? <span style={{color: 'red'}}>{name}</span> : name
return (
<tr>
<td>{renderName}</td>
<td>{product.price}</td>
</tr>
)
}
function ProductCategoryRow(props) {
const product = props.product;
return(
<tr>
<th colSpan="2">{product.category}</th>
</tr>
)
}
function ProductTable(props) {
const { filterText, isStockedOnly, products } = props;
// 处理数据的方法!!!需要分类的属性是category,
// 如果数据不是按照该属性排序,那先将其按照category的字段顺序
let lastCategory = null;
let rows = []
products.sort((a,b) => a.category.localeCompare(b.category))
.forEach(product => {
if (!product.name.includes(filterText)) {
return;
}
if (isStockedOnly && !product.stocked) {
return;
}
if (product.category !== lastCategory) {
rows.push(<ProductCategoryRow key={product.category} product={product} />)
}
rows.push(
<ProductRow key={product.name} product={product} />
)
lastCategory = product.category;
}); return (
<table>
<thead>
<tr>
<th>name</th>
<th>price</th>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
)
}
function SearchBar(props) {
function handleChange (e) {
const { name, type } = e.target;
const value = type === 'checkbox' ? e.target.checked : e.target.value;
props.handleChange(name, value);
}
const { filterText, isStockedOnly } = props;
return(
<div>
<input
name="filterText"
type="text"
value={filterText}
onChange={handleChange}
placeholder="search..."
/>
<p>
<input
name="isStockedOnly"
type="checkbox"
checked={isStockedOnly}
onChange={handleChange}
/>{' '}
Only show products in stock
</p>
</div>
)
}
class FileterableProductTable extends React.Component {
constructor(props) {
super(props);
this.state = {
filterText: '',
isStockedOnly: false
}
}
handleChange = (name, value) => {
this.setState({
[name]: value
})
}
render() {
const { filterText, isStockedOnly } = this.state;
const { products } = this.props;
return(
<React.Fragment>
<SearchBar
filterText={filterText}
isStockedOnly={isStockedOnly}
handleChange={this.handleChange}
/>
<ProductTable
filterText={filterText}
isStockedOnly={isStockedOnly}
products={products}
/>
</React.Fragment>
)
}
} ReactDOM.render(<FileterableProductTable products={products} />, root);

从设计稿到实现React应用(分类数据处理)的更多相关文章

  1. React Native不同设备分辨率适配和设计稿尺寸单位px的适配

    React Native中使用的尺寸单位是dp(一种基于屏幕密度的抽象单位.在每英寸160点的显示器上,1dp = 1px),而设计师使用的是px, 这两种尺寸如何换算呢? 官方提供了PixelRat ...

  2. iPhone 6/6 Plus 出现后,如何改进工作流以实现一份设计稿支持多个尺寸?

    iPhone 6/6 Plus 出现后,如何改进工作流以实现一份设计稿支持多个尺寸? 2014-12-05 09:33 编辑: suiling 分类:iOS开发 来源:知乎(pigtwo)  2 22 ...

  3. iOS设计 - 一款APP从设计稿到切图过程概述

    这篇文章站在GUI设计师的角度概述了APP从项目启动到切片输出的过程,相当于工作流程的介绍.这里写的不是一种规范,只是一种工作方法,加上技术的更新是非常快的,大家在具体工作中,一定要灵活运用. 这里我 ...

  4. 从网易与淘宝的font-size思考前端设计稿与工作流

    本文结合自己对网易与淘宝移动端首页html元素上的font-size这个属性的思考与学习,讨论html5设计稿尺寸以及前端与设计之间协作流程的问题,内容较多,但对你的技术和工作一定有价值,欢迎阅读和点 ...

  5. 从网易与淘宝的font-size思考前端设计稿与工作流 (转)

    从网易与淘宝的font-size思考前端设计稿与工作流   阅读目录 1. 问题的引出 2. 简单问题简单解决 3. 网易的做法 4. 淘宝的做法 5. 比较网易与淘宝的做法 6. 如何与设计协作 7 ...

  6. 学习笔记:只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图

    如何在只有一套app设计稿(5s尺寸)切出4和4s尺寸以及安卓系统主流尺寸的图 转自:http://www.zhihu.com/question/23255417   版权归原作者所有 目前ios手机 ...

  7. 移动端H5页面的设计稿尺寸大小规范-转载自http://www.chinaz.com/design/2015/1103/465670.shtml

    机屏幕尺寸,设计稿应该按照哪一个尺寸作为标准尺寸.现在已经有2K分辨率的手机屏幕了,设计稿是不是也要把宽高跟着最大分辨率来设计.显然不是. 请注意:(以下所有讨论内容和规范均将viewport设定为c ...

  8. 一款APP从设计稿到切图过程全方位揭秘 Mark

    纯干货!一款APP从设计稿到切图过程全方位揭秘   @BAT_LCK:我本身是一名GUI设计师,所以我只站在GUI设计师的角度去把APP从项目启动到切片输出的过程写一写,相当于工作流程的介绍吧.公司不 ...

  9. iPhone 6出现后,如何将一份设计稿支持多个尺寸?

    http://mp.weixin.qq.com/s?__biz=MzA4NTQzNTMwOA==&mid=201174413&idx=3&sn=c3fe5b3459bac288 ...

随机推荐

  1. Python爬虫框架

    本文章的源代码来源于https://github.com/Holit/Web-Crawler-Framwork 一.爬虫框架的代码 import urllib.request from bs4 imp ...

  2. TZOJ3133: 求对称点

    #include<stdio.h> int main() { double a,b,c,d,e,f,g,h,i; while(~scanf("%lf %lf %lf %lf %l ...

  3. MACD波段选股

    MA12:=MA(C,); {股价连续3天站稳12日均线,且12日均线走平或向上} C1:=EVERY(C>MA12,) AND MA12>=REF(MA12,); {MACD金叉,且DI ...

  4. java 读取文件流

    搬运自速学堂:https://www.sxt.cn/Java_jQuery_in_action/ten-iqtechnology.html JAVA中IO流体系: 四大IO抽象类 ·InputStre ...

  5. springboot2.x配置druid sql监控

    后端接口响应慢,通常我们就需要优化代码和sql,如果项目中使用druid连接池,那么我们可以利用其提供的sql监控功能,来帮助我们快速定位慢sql已经sql执行次数等问题,springboot2之后, ...

  6. 【SoloPi】SoloPi使用1-初次使用,环境准备(Windows版)

    下载配置Android SDK路径前往 https://developer.android.com/studio/releases/platform-tools#downloads 下载对应系统版本的 ...

  7. 苹果appstore应用名下面的开发者名称填写或修改

    最近上架不小心遇到一个问题,开发者名称写错了,放假前大意了,记录一下修改过程,希望碰到同样问题的伙伴不要要着急,下面的内容可能帮你哦. 我们应用的之前的开发者名称是个人的,之前没注意这个问题,以后想注 ...

  8. python渗透库大集合

    l Scapy:一款强大的交互式数据报分析工具,可用作发送.嗅探.解析和伪造网络数据包. l pypcap.Pcapy和pylibpcap:配合libpcap一起使用的数据包捕获模块 l libdne ...

  9. C++ 基础知识汇总 持续更新

    摘录一些C++面试常考问题,写一些自己的理解,花了挺长时间的,作图是真的累,欢迎来摘果子. static关键字 用于声明静态对象: 静态函数只在本文件可见.(默认是extern的) 全局静态对象:全局 ...

  10. 关于#error

    很简单的一个东西,但是感觉使用价值没有太大.实现了以下,结果如下: 执行到#error语句的时候直接停止编译,在下面输出设定好的错误信息. 来自为知笔记(Wiz)