React开发流程——利用React构建简单的可检索产品数据表
今天就是春节了,祝各位鸡年大吉,心想事成 使用React构建可搜索产品数据表 UI与JSON首先我们从我们的UI设计师那里拿到了UI模拟图和JSON-API [
{category: "Sporting Goods",price: "$49.99",stocked: true,name: "Football"},{category: "Sporting Goods",price: "$9.99",name: "Baseball"},price: "$29.99",stocked: false,name: "Basketball"},{category: "Electronics",price: "$99.99",name: "iPod Touch"},price: "$399.99",name: "iPhone 5"},price: "$199.99",name: "Nexus 7"}
];
category是产品类别 拆分UI视图首先我们要做的第一项工作就是拆分UI
当然你也可以在细拆把ProductTable中的Name和Price拆出来
构建静态版本静态的版本也就是页面最初应该显示的版本
意思就是像我们这样简单的例子中 var PRODUCTS = [
{category: 'Sporting Goods',price: '$49.99',name: 'Football'},{category: 'Sporting Goods',price: '$9.99',name: 'Baseball'},price: '$29.99',name: 'Basketball'},{category: 'Electronics',price: '$99.99',name: 'iPod Touch'},price: '$399.99',name: 'iPhone 5'},price: '$199.99',name: 'Nexus 7'}
];
var FilterableProductTable = React.createClass({
render: function(){
return (
<div>
<SearchBar/>
<ProductTable products={this.props.products}/>
</div>
)
}
});
var SearchBar = React.createClass({
render: function(){
return (
<div>
<input type="text"/><br/>
<input type="checkbox"/>Only show products in stock<br/><br/>
</div>
)
}
});
var ProductTable = React.createClass({
render: function(){
var rows = [];
var lastCategory = null;
this.props.products.forEach(function(product){
if(product.category !== lastCategory){
rows.push(<ProductCategoryRow category={product.category} key={product.category}/>);
}
rows.push(<ProductRow product={product} key={product.name}/>);
lastCategory = product.category;
});
return (
<table>
<thead>
<tr>
<td><strong>Name</strong></td>
<td><strong>Price</strong></td>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
)
}
});
var ProductCategoryRow = React.createClass({
render: function(){
return (
<tr>
<td><strong>{this.props.category}</strong></td>
</tr>
)
}
});
var ProductRow = React.createClass({
render: function(){
var name = this.props.product.stocked ?
this.props.product.name :
<span style={{color:"red"}}>{this.props.product.name}</span>;
return (
<tr>
<td>{name}</td>
<td>{this.props.product.price}</td>
</tr>
)
}
});
ReactDom.render(
<FilterableProductTable products={PRODUCTS}/>,document.getElementById('root')
)
很好的体现了React单向数据流的特点 var rows = [];
var lastCategory = null;
this.props.products.forEach(function(product){
if(product.category !== lastCategory){
rows.push(<ProductCategoryRow category={product.category} key={product.category}/>);
}
rows.push(<ProductRow product={product} key={product.name}/>);
lastCategory = product.category;
});
利用了数组的形式将静态列表的组件项存储下来 售罄产品过滤我们先来考虑点击那个复选框来重置是否显示售罄产品过滤 var FilterableProductTable = React.createClass({
getInitialState: function(){
return {
inStockOnly: false
}
},//设置初始状态:产品默认展示全部
checkHandler: function(){
this.setState({
inStockOnly: !this.state.inStockOnly
});
},//复选框要绑定的事件处理函数:改变inStockOnly状态
render: function(){
return (
<div>
<SearchBar checkHandler={this.checkHandler}/> //将事件处理函数作为数据传递给子级
<ProductTable products={this.props.products} inStockOnly={this.state.inStockOnly}/>
//将状态state作为属性props传递给子级
</div>
)
}
});
var SearchBar = React.createClass({
render: function(){
return (
<div>
<input type="text"/><br/>
<input type="checkbox" onChange={this.props.checkHandler}/>Only show products in stock<br/><br/>
//为复选框绑定change事件处理函数
</div>
)
}
});
var ProductTable = React.createClass({
render: function(){
var rows = [];
var lastCategory = null;
var products = this.props.inStockOnly ?
this.props.products.filter(function(product){
return product.stocked;
}) : this.props.products;
//通过判断状态inStockOnly来决定是否过滤products数组
products.forEach(function(product){
if(product.category !== lastCategory){
rows.push(<ProductCategoryRow category={product.category} key={product.category}/>);
}
rows.push(<ProductRow product={product} key={product.name}/>);
lastCategory = product.category;
});
return (
<table>
<thead>
<tr>
<td><strong>Name</strong></td>
<td><strong>Price</strong></td>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
)
}
});
关键字过滤产品进度已经过去一大半了 var FilterableProductTable = React.createClass({
getInitialState: function(){
return {
inStockOnly: false,filterText: '' //表示输入框中字符
}
},checkHandler: function(){
this.setState({
inStockOnly: !this.state.inStockOnly
});
},textHandler: function(text){
this.setState({
filterText: text
});
},//输入框字符改变状态随之改变,但是还不能获取输入框中字符,所以设置一个参数test
render: function(){
return (
<div>
<SearchBar checkHandler={this.checkHandler} textHandler={this.textHandler}/>
//将事件处理函数作为数据传递给SearchBar组件
<ProductTable products={this.props.products} inStockOnly={this.state.inStockOnly} filterText={this.state.filterText}/>
//将filterText状态传递给ProductTable组件
</div>
)
}
});
var SearchBar = React.createClass({
Handler: function(){
this.props.textHandler(this.refs.input.value);
},//为了将获取的输入框内字符传入textHandler作为参数,外部包装一个函数
render: function(){
return (
<div>
<input type="text" ref="input" onChange={this.Handler}/><br/>
// 绑定change事件处理函数
<input type="checkbox" onChange={this.props.checkHandler}/>Only show products in stock<br/><br/>
</div>
)
}
});
var ProductTable = React.createClass({
render: function(){
var rows = [];
var lastCategory = null;
var products = this.props.products;
var inStockOnly = this.props.inStockOnly;
var filterText = this.props.filterText;
products = inStockOnly ?
products.filter(function(product){
return product.stocked;
}) : products;
products = filterText ?
products.filter(function(product){
return product.name.indexOf(filterText) !== -1;
}) : products;//通过字符限制一步过滤
products.forEach(function(product){
if(product.category !== lastCategory){
rows.push(<ProductCategoryRow category={product.category} key={product.category}/>);
}
rows.push(<ProductRow product={product} key={product.name}/>);
lastCategory = product.category;
});
return (
<table>
<thead>
<tr>
<td><strong>Name</strong></td>
<td><strong>Price</strong></td>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
)
}
});
完整版本完整的脚本代码如下 var React = require('react');
var ReactDom = require('react-dom');
var PRODUCTS = [
{category: 'Sporting Goods',name: 'Nexus 7'}
];
var FilterableProductTable = React.createClass({
getInitialState: function(){
return {
inStockOnly: false,filterText: ''
}
},render: function(){
return (
<div>
<SearchBar checkHandler={this.checkHandler} textHandler={this.textHandler}/>
<ProductTable products={this.props.products} inStockOnly={this.state.inStockOnly} filterText={this.state.filterText}/>
</div>
)
}
});
var SearchBar = React.createClass({
Handler: function(){
this.props.textHandler(this.refs.input.value);
},render: function(){
return (
<div>
<input type="text" ref="input" onChange={this.Handler}/><br/>
<input type="checkbox" onChange={this.props.checkHandler}/>Only show products in stock<br/><br/>
</div>
)
}
});
var ProductTable = React.createClass({
render: function(){
var rows = [];
var lastCategory = null;
var products = this.props.products;
var inStockOnly = this.props.inStockOnly;
var filterText = this.props.filterText;
products = inStockOnly ?
products.filter(function(product){
return product.stocked;
}) : products;
products = filterText ?
products.filter(function(product){
return product.name.indexOf(filterText) !== -1;
}) : products;
products.forEach(function(product){
if(product.category !== lastCategory){
rows.push(<ProductCategoryRow category={product.category} key={product.category}/>);
}
rows.push(<ProductRow product={product} key={product.name}/>);
lastCategory = product.category;
});
return (
<table>
<thead>
<tr>
<td><strong>Name</strong></td>
<td><strong>Price</strong></td>
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
)
}
});
var ProductCategoryRow = React.createClass({
render: function(){
return (
<tr>
<td><strong>{this.props.category}</strong></td>
</tr>
)
}
});
var ProductRow = React.createClass({
render: function(){
var name = this.props.product.stocked ?
this.props.product.name :
<span style={{color:"red"}}>{this.props.product.name}</span>;
return (
<tr>
<td>{name}</td>
<td>{this.props.product.price}</td>
</tr>
)
}
});
ReactDom.render(
<FilterableProductTable products={PRODUCTS}/>,document.getElementById('root')
)
UI视图切分为组件模块 ==主页传送门== (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |