react经典进阶demo

这是我在官方文档上看到的,功能是实现(具体是什么,请往下看)

以下是json数据:

1 [
2   {category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football"},
3   {category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball"},
4   {category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball"},
5   {category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch"},
6   {category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5"},
7   {category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7"}
8 ];

显示红色的物品,是没有库存的(stocked:false),如$29.99的basketball和$399.99的iphone5。

在我看来react的结构就像‘包饺子’,一层夹着一层,可以看一下上图的几个边框,不同颜色代表着不同区域划分。

1.(orange): contains the entirety of the example 外边的黄色区域,包含整个例子。

2.(blue): receives all user input  里面一层的蓝色框框,度用户的输入进行serach。

3.(green): displays and filters the data collection based onuser input   绿色框展示用户筛选的物品信息。

4. (turquoise): displays a heading for each category  显示产品种类,这里是sproting goods和electronics。

5.(red): displays a row for each product  红色框,每件物品。

 1 //这是结构的最外一层  它里面包含searchBar和producTable两个组件
 2 var FilterableProductTable = React.createClass({
 3   render: function() {
 4     return (
 5       <div>
 6         <SearchBar />
 7         <ProductTable products={this.props.products} />
 8       </div>
 9     );
10   }
11 });
12
13
14 var PRODUCTS = [
15   {category: ‘Sporting Goods‘, price: ‘$49.99‘, stocked: true, name: ‘Football‘},
16   {category: ‘Sporting Goods‘, price: ‘$9.99‘, stocked: true, name: ‘Baseball‘},
17   {category: ‘Sporting Goods‘, price: ‘$29.99‘, stocked: false, name: ‘Basketball‘},
18   {category: ‘Electronics‘, price: ‘$99.99‘, stocked: true, name: ‘iPod Touch‘},
19   {category: ‘Electronics‘, price: ‘$399.99‘, stocked: false, name: ‘iPhone 5‘},
20   {category: ‘Electronics‘, price: ‘$199.99‘, stocked: true, name: ‘Nexus 7‘}
21 ];
22  //这里的prop属性定义了product  引用字上面的json数据
23 ReactDOM.render(
24   <FilterableProductTable products={PRODUCTS} />,
25   document.getElementById(‘container‘)
26 );
27
28 //这是最简单的搜索框组件
29 var SearchBar = React.createClass({
30   render: function() {
31     return (
32       <form>
33         <input type="text" placeholder="Search..." />
34         <p>
35           <input type="checkbox" />
36           {‘ ‘}
37           Only show products in stock
38         </p>
39       </form>
40     );
41   }
42 });
43
44 //关键的来了  这个productTable里面还包含了一些组件
45 var ProductTable = React.createClass({
46   render: function() {
47     var rows = [];
48     var lastCategory = null;
49     //遍历json数据
50     this.props.products.forEach(function(product) {
51       if (product.category !== lastCategory) {  //注意这里的判断,并不是每回都要把类别加一次
52        //这里有一个产品种类的组件
53       rows.push(<ProductCategoryRow category={product.category} key={product.category} />);
54       }
55       //还有一个产品行的组件
56       rows.push(<ProductRow product={product} key={product.name} />);
57       lastCategory = product.category;
58     });
59     return (
60       <table>
61         <thead>
62           <tr>
63             <th>Name</th>
64             <th>Price</th>
65           </tr>
66         </thead>
67         <tbody>{rows}</tbody>
68       </table>
69     );
70   }
71 });
72
73 //category在上面可以找到
74 var ProductCategoryRow = React.createClass({
75   render: function() {
76     return (<tr><th colSpan="2">{this.props.category}</th></tr>);
77   }
78 });
79
80 var ProductRow = React.createClass({
81   render: function() {
82     //如果没有货存  红色字体显示
83    var name = this.props.product.stocked ?
84       this.props.product.name :
85       <span style={{color: ‘red‘}}>
86         {this.props.product.name}
87       </span>;
88     return (
89       <tr>
90         <td>{name}</td>
91         <td>{this.props.product.price}</td>
92       </tr>
93     );
94   }
95 });

就这样玩了吗?还没有,以上还没实现搜索和过滤功能。

  1 var ProductCategoryRow = React.createClass({
  2   render: function() {
  3     return (<tr><th colSpan="2">{this.props.category}</th></tr>);
  4   }
  5 });
  6
  7 var ProductRow = React.createClass({
  8   render: function() {
  9     var name = this.props.product.stocked ?
 10       this.props.product.name :
 11       <span style={{color: ‘red‘}}>
 12         {this.props.product.name}
 13       </span>;
 14     return (
 15       <tr>
 16         <td>{name}</td>
 17         <td>{this.props.product.price}</td>
 18       </tr>
 19     );
 20   }
 21 });   //这里都没变
 22
 23 //注意这里有改动
 24 var ProductTable = React.createClass({
 25   render: function() {
 26     var rows = [];
 27     var lastCategory = null;
 28     this.props.products.forEach(function(product) {
 29     //用于过滤产品(用户输入的关键字和库存)
 30       if (product.name.indexOf(this.props.filterText) === -1 || (!product.stocked && this.props.inStockOnly)) { //注意此处的逻辑
 31         return;
 32       }
 33       if (product.category !== lastCategory) {
 34         rows.push(<ProductCategoryRow category={product.category} key={product.category} />);
 35       }
 36       rows.push(<ProductRow product={product} key={product.name} />);
 37       lastCategory = product.category;
 38     }.bind(this));  //由于函数里面用到了this  这里bind一下
 39     return (
 40       <table>
 41         <thead>
 42           <tr>
 43             <th>Name</th>
 44             <th>Price</th>
 45           </tr>
 46         </thead>
 47         <tbody>{rows}</tbody>
 48       </table>
 49     );
 50   }
 51 });
 52
 53 //serachBar现在膨胀了  这么多
 54 var SearchBar = React.createClass({
 55   handleChange: function() {
 56      //上面肯定有个函数  肯定在父组件上
 57       this.props.onUserInput(
 58       this.refs.filterTextInput.value,
 59       this.refs.inStockOnlyInput.checked  //注意这里的ref用法
 60     );
 61   },
 62   render: function() {
 63     return (
 64       <form>
 65         <input
 66           type="text"
 67           placeholder="Search..."
 68           value={this.props.filterText}
 69           ref="filterTextInput"
 70           onChange={this.handleChange} //文本改变回调事件  它的作用是什么?  下面有答案
 71         />
 72         <p>
 73           <input
 74             type="checkbox"
 75             checked={this.props.inStockOnly}
 76             ref="inStockOnlyInput"
 77             onChange={this.handleChange} //checkbox的判断
 78           />
 79           {‘ ‘}
 80           Only show products in stock
 81         </p>
 82       </form>
 83     );
 84   }
 85 });
 86
 87 //关键的来了   这个里面就是饺子皮
 88 var FilterableProductTable = React.createClass({
 89   getInitialState: function() {
 90     return {
 91       filterText: ‘‘,
 92       inStockOnly: false
 93     };
 94   },  //这里初始化的state  文本为空  默认checkbox=false
 95
 96   handleUserInput: function(filterText, inStockOnly) {
 97     this.setState({
 98       filterText: filterText,
 99       inStockOnly: inStockOnly
100     });
101   },
102
103   render: function() {
104     return (
105       <div>
106         <SearchBar
107          //prop定义的的位置  可以对照着看
108           filterText={this.state.filterText}
109           inStockOnly={this.state.inStockOnly}
110           onUserInput={this.handleUserInput} //这个函数用于改变初始state
111         />
112         //prop定义的位置  要注意这里的ProductTable里面的filterText和instockOnly  是随着serachBar的输入变动的
113         <ProductTable
114           products={this.props.products}
115           filterText={this.state.filterText}
116           inStockOnly={this.state.inStockOnly}
117         />
118       </div>
119     );
120   }
121 });
122
123 var PRODUCTS = [
124   {category: ‘Sporting Goods‘, price: ‘$49.99‘, stocked: true, name: ‘Football‘},
125   {category: ‘Sporting Goods‘, price: ‘$9.99‘, stocked: true, name: ‘Baseball‘},
126   {category: ‘Sporting Goods‘, price: ‘$29.99‘, stocked: false, name: ‘Basketball‘},
127   {category: ‘Electronics‘, price: ‘$99.99‘, stocked: true, name: ‘iPod Touch‘},
128   {category: ‘Electronics‘, price: ‘$399.99‘, stocked: false, name: ‘iPhone 5‘},
129   {category: ‘Electronics‘, price: ‘$199.99‘, stocked: true, name: ‘Nexus 7‘}
130 ];
131
132 ReactDOM.render(
133   <FilterableProductTable products={PRODUCTS} />,
134   document.getElementById(‘container‘)
135 );

好了,代码量并不大,但是这里面的逻辑和每层之间的关系确实有点搞人呀。。。希望大家看懂了react想表达的是什么

时间: 2024-11-08 08:15:16

react经典进阶demo的相关文章

React问答小demo

在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次点击,隐藏表单.同时,点击"取消"按钮,隐藏表单. 2.输入问题标题和内容后,点击"确认"按钮,将问题显示在下方(按照投票数从高到低). 3.每个问题有加票和减票功能,在点击的同时,将问题按照投票数从高到低排序. 实现过程: 一.开发环境和工具 1.npm init (

React Native八大Demo

参考资料:http://www.cnblogs.com/shaoting/p/7148240.html 下一个项目公司也打算使用react native.大致看了下原型设计,写几个小demo先试试水.特此记录下. 1.微信及朋友圈分享.QQ及朋友圈分享,微博分享,微信支付,支付宝支付. 2.导航条渐隐 3.通讯录 4.卡片式轮播 5.时间轴 6.图片+列表的组合效果 7.图片下拉放大 8.原生视频播放器 9.react-navigation的使用和变更 10.倒计时 11.多张图片查看 12.自

React Router简单Demo

简介 react router是使用react的时候首选的一个路由工具. 安装 react router包含react-router,react-router-dom和react-router-native这三个包,分别是路由核心组件和浏览器端组件和native端组件,所以我们需要安装react-router-dom npm install --save react-router-dom 安装后就可以直接使用了 https://codepen.io/pshrmn/pen/YZXZqM?edito

用react写一个demo,增删列表

今天学了一点react,挺好玩的哈哈,分享一下demo 1.环境搭建 (1)首先进入node.js官网,下载nods.js后安装,安装成功后会自带安装npm,接下来验证是否安装成功,在cmd中输入node -v和npm -v后若输出版本号及证明安装成功,如下: (2)下载submit._text,进入submit官网,下载软件后安装即可 2.react项目创建 (1)进入cmd,输入命令 npx create-react-app app cd app npm start 即可创建一个名为app的

react context toggleButton demo

//toggleButton demo: //code: //1.Appb.js: import React from 'react'; import {ThemeContext, themes} from './theme-context'; import ThemeTogglerButton from './theme-toggler-button'; class Appb extends React.Component { constructor(props) { super(props)

react todoList小demo

基于create-react-app做的小demo 比较简单直接上代码 效果图 import React from 'react' import Input from '../../components/Input/index' import List from '../../components/List/index' class Todo extends React.Component{ constructor(props){ super(props) this.state={ todos:

呕血总结React Native 这里有你最想要的(react native进阶)

一.前沿||潜心修心,学无止尽.生活如此,coding亦然.本人鸟窝,一只正在求职的鸟.联系我可以直接微信:jkxx123321 二.项目总结 **||**文章参考资料:1.  http://blog.csdn.net/u011272795/article/details/73824558 2.http://blog.csdn.net/qq_25280063/article/details/52294221 1)px2dp详细总结 现在的手机品牌和型号越来越多,导致我们平时写布局的时候会在个不同

夺命雷公狗-----React---22--小案例之react经典案例todos(上)

在很多前端框架中todos都是一个小的参考例子,在react中当然也是不例外的,先来看看最终的效果先... 这个就是官方的例子,我们先来分析下他是由那及格组建组合成的... 再来分析下他是的数据最终是由那些地方过来的... 由于我们在react里面传递的参数都是不能跨级传递的,都是通过一级级往下传递的,如下图所示: 然后再Ul组建里面用props来进行传递,因为是数组我们可以使用数组的方式进行传递.. 但是这种方式只要懂得编程的朋友们应该都知道是不科学的,当然react也不列外,他给我们开发者预

软件也需靠脸吃饭,带您做张明星脸 --ASP.NET MVC+Jquery开发框架形成之旅(后台经典框架 DEMO 下载)

众所周知程序员得靠技术吃饭,但是真的光靠技术就够了吗?Teacher苍,一位德艺双馨的艺术家,论技术她自然是炉火纯青,我觉得她桃李遍天下的原因不仅限于些,试想如果Teacher苍长得跟凤姐一样再带点乡村可爱非主流的打扮,屏幕前的您还会一次又一次研习她的教学视频么?这说明外表还是非常重要的.其实软件也正是这样,那些需要面向客户的产品,就算你的架构再牛逼,算法再骇人听闻,但是前端界面不够漂亮时客户可能根本对你的产品完全不感兴趣,纵使您的技术超越Teacher苍都无济于事了.好了!先自我介绍一下,我叫