2016-09-10 47 views
0

我的代码更清洁的方式如下:写ReactJS组件

import React, {PropTypes} from 'react'; 
import ReactCSSTransitionGroup from 'react-addons-css-transition-group'; 
import { filter_names } from './filterActions'; 
import Price from './price'; 
import Year from './year'; 
import Make from './make'; 
import Model from './model'; 
import Mileage from './mileage'; 
import Transmission from './transmission'; 
import Fuel from './fuel'; 

class filters extends React.Component { 

    showFilters(filters){ 

     return filters.map(filter => { 
      switch (filter.name){ 
       case filter_names.priceRange: 
        return <Price recap={filters.some(f => f.name === filter_names.priceRange)} title="Price" filters={filters} {...this.props}/>; 
       case filter_names.year: 
        return <Year recap={filters.some(f => f.name === filter_names.year)} title="Year" filters={filters} {...this.props}/>; 
       case filter_names.mileage: 
        return <Mileage recap={filters.some(f => f.name === filter_names.mileage)} title="Mileage" filters={filters} {...this.props}/>; 
       case filter_names.fuel: 
        return <Fuel recap={filters.some(f => f.name === filter_names.fuel)} title="Fuel" filters={filters} {...this.props}/>; 
       case filter_names.transmission: 
        return <Transmission recap={filters.some(f => f.name === filter_names.transmission)} title="Transmission" filters={filters} {...this.props}/>; 
       default: 
        return true; 
      } 
     }) 
    } 


    render(){ 
     const language = this.props.language; 
     const filters = this.props.filters; 

     return (
      <div className="filters noPadding col-xl-8 col-lg-6 col-md-6 col-sm-5 col-xs-12"> 
       <ReactCSSTransitionGroup transitionName="example" transitionAppear={true} transitionAppearTimeout={500} transitionEnterTimeout={500} transitionLeaveTimeout={500}> 
        {this.showFilters(filters)} 
       </ReactCSSTransitionGroup> 
      </div> 
     ); 
    } 

} 

export default filters; 

有没有办法把它写在一个更清洁的方式?我在showFilter中使用了所有这些组件。我是否需要为每个组件重复它,或者有没有更简单的方法来完成它?

+0

我觉得您应该是更具体的了解您所要实现的目标,或那么这应该被移动到http://codereview.stackexchange.com/ – Waiski

回答

-1

的过滤器创建一个基类:

class BaseFilter extends React.Component { 
    showFilters(filters){  
    } 
} 

派生您所有过滤器类从BaseFilter:

class AnotherFilter extends BaseFilter { 
    render() { 
    } 
} 
+0

这并不能解决他们的问题(另外,在React中使用继承通常是一个坏主意)。他们不希望每个组件都可以访问'showFilters',他们希望根据该功能的结果显示一组不同的子组件。 –

+0

反应比继承更喜欢构图。继承不会简化代码,只能将其隐藏在子类中 –

+0

我错了!我的印象是有很多Filter组件有一些常用的方法。我遇到了一些基类有意义的场景。 – vijayst