前端技术汇总转载的~react@IT·互联网

通过案例深入了解React

2016-08-28  本文已影响1908人  魔力老钱

结合react官网的案例,利用webpack+es6,完成了React案例。

React官网组件案例

github地址

demo地址


项目结构图:

github上面获取源码之后,安装所需要的插件


npm install 

提取开发环境公共js,如react, react-dom


npm run vendor

运行开发环境


npm run start

提取生产环境公共js,如react, react-dom


npm run prod-vendor

运行生产环境,生成dist


npm run prod

案例主要分为5个组件


一、SearchBar(蓝色表现部分)


import React,{Component} from 'react';//引入react
import './index.scss';//引入css文件
//接收用户输入的组件
export default class SearchBar extends Component{
    constructor(props){
        super(props);
        this.state={

        }
    }
    /**
     * 输入框改变或者复选框改变 调用父组件的方法,传递需要改变state的参数
     * @return {[type]} [description]
     */
    handleChange=()=>{
        this.props.onUserInput(
            this.refs.filterTextInput.value,
            this.refs.inStockOnlyInput.checked
        );
    }
    render(){   
        return(
            <form>
                <input className='txtName' type="text" 
                placeholder="Search..." 
                value={this.props.filterText} 
                ref="filterTextInput"
                onChange={this.handleChange}
                />
                <p>
                    <input type="checkbox" name="" 
                    checked={this.props.inStockOnly}
                    ref="inStockOnlyInput"
                    onChange={this.handleChange}
                     />
                    {' '}
                    Only show products in stock
                </p>
            </form>
        )
    }
}

二、ProductRow(红色表现部分)


import React,{Component} from 'react';//引入react
import './index.scss';//引入css文件
//创建列表组件
export default class ProductRow extends Component{
    constructor(props){
        super(props);
        this.state={

        }
    }
    
    render(){
        //根据stocked状态显示时候需要加上红色
        let 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>
        )
    }
}

三、ProductCategoryRow(蓝绿色表示部分)


import React,{Component} from 'react';//引入react
import './index.scss';//引入css文件

//创建列标题组件
export default class ProductCategoryRow extends Component{
    constructor(props){
        super(props);
        this.state={

        }
    }
    
    render(){
        return(
            <tr><th colSpan="2">{this.props.category}</th></tr>
        )
    }
}

四、ProductTable(绿色表现部分)

(这是ProductCategoryRow与ProductRow组合而成的组合组件)

import React,{Component} from 'react';//引入react
import ProductCategoryRow from '.././productCategoryRow/index.js';//引入列标题
import ProductRow from '.././productRow/index.js';//引入列表组件
import './index.scss';//引入css文件
//创建根据用户输入过滤展示数据组件
export default class ProductTable extends Component{
    constructor(props){
        super(props);
        this.state={

        }
    }
    
    render(){   
        let rows=[];
            let lastCategory=null;
            this.props.products.forEach((product)=>{
                //过滤数据
                if(product.name.indexOf(this.props.filterText)===-1||(!product.stocked&&this.props.inStockOnly)){
                    return;
                }

                //如果是一个新的列标题,则加上列标题
                if(product.category!=lastCategory){
                    rows.push(<ProductCategoryRow category={product.category} key={product.category} />);
                }
                /**
                 * 插入列表
                 * @type {Object}
                 */
                rows.push(<ProductRow product={product} key={product.name} />);
                /**
                 * 把最后的列标题更新
                 * @type {[type]}
                 */
                lastCategory=product.category;
        });
        return(
            <table>
                <thead>
                <tr>
                    <th>Name</th>
                    <th>Price</th>
                </tr>
                </thead>
                <tbody>{rows}</tbody>
            </table>
        )
    }
}

五、FilterableProductTable(橘色表现部分)

(productTable与searchBar组合而成的混合组件)

import React,{Component} from 'react';//引入react
import ProductTable from '.././productTable/index.js';//引入数据集合
import SearchBar from '.././searchBar/index.js';//引入数据集合
import './index.scss';//引入css文件
//创建根据用户输入过滤展示数据组件
export default class FilterableProductTable extends Component{
    constructor(props){
        super(props);
        this.state={
            filterText: '',
            inStockOnly: false
        }
    }
    //根据子组件传入的参数改变state
    handleUserInput=(filterText,inStockOnly)=>{
        this.setState({filterText:filterText,inStockOnly:inStockOnly});
    }
    render(){   
        return(
            <div className='wrap'>
                <SearchBar filterText={this.state.filterText}
                 inStockOnly={this.state.inStockOnly} 
                 onUserInput={this.handleUserInput}
                />
                < ProductTable products={this.props.products} filterText={this.state.filterText} inStockOnly={this.state.inStockOnly}  />
            </div>
        )
    }
}

(完成)

上一篇下一篇

猜你喜欢

热点阅读