从API端点对ReactJS中的对象数组进行排序

时间:2017-04-27 18:26:02

标签: javascript sorting reactjs

简而言之:我正在开发一个自行车收集应用程序,我从端点中提取一个对象数组以显示在页面上。我现在想要在用户选择下拉菜单中的字段时添加基于年份,品牌和尺寸对自行车进行分类/过滤的功能。我如何在反应中通过组件实现内部?

与浏览器中的类似:/ category?year = 2000& size = XL& brand = cervelo,我想在选择下拉列表中的字段时从我的组件中执行此操作。

这是我的组成部分:

import React, { Component } from 'react'
import actions from '../../actions'
import  { Link } from 'react-router'
import { connect } from 'react-redux'

class Category extends Component {
  constructor(){
    super()
    this.state = {

    }
  }
  componentDidMount(){

    this.props.getAllBikes()

  }

  render(){
    return(
      <div>
        <div className="col-xs-12 col-md-2" style={{paddingTop: 0, paddingRight: '70px', left: '5.5%', top: '-4px'}}>
            <aside>
                <ul className="nav-coupon-category panel">
                  <li className="all-cat">
                      <a className="font-14" href="#">Kategorier:</a>
                  </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Tri Cykler</a>
                    </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Racercykler</a>
                    </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Mountainbikes</a>
                    </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Bane Cykler</a>
                    </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Cross Cykler</a>
                    </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Hverdags Cykler</a>
                    </li>
                    <li><a href="#"><i className="fa fa-angle-double-right"></i>Vinter Racercykler</a>
                    </li>

                </ul>
            </aside>
        </div>
        <main id="mainContent" className="main-content">
  <div className="page-container ptb-60">
<div className="container">


  <div className="contact-area contact-area-v1 panel">
      <div className="row row-tb-20">
          <div style={{paddingBottom: 0}} className="col-xs-12">
            <div className="filter-search">
              <div className="row">
                <div style={{right: '-30px'}} className="col-6 col-md-3 filter-height">
                  <div className="right-10 pos-tb-center">
                                <select style={{width: '232%'}} className="form-control input-sm">
                                    <option>Mærke/Brand</option>
                                    <option>Giant</option>
                                    <option>Trek</option>
                                    <option>Specialized</option>
                                    <option>S-Works</option>
                                    <option>Cannondale</option>
                                    <option>Cervelo</option>
                                    <option>Scott</option>
                                    <option>Bianchi</option>
                                    <option>Canyon</option>
                                    <option>Cube</option>
                                    <option>Pinarello</option>
                                    <option>Fuji</option>
                                    <option>Colnago</option>
                                    <option>Felt</option>
                                    <option>Wilier</option>
                                    <option>BH</option>
                                </select>
                            </div>
                </div>
                <div style={{right: '-13px'}} className="col-6 col-md-3 filter-height">
                  <div className="right-10 pos-tb-center">
                                <select style={{width: '324%'}} className="form-control input-sm">
                                    <option>Størrelse</option>
                                    <option>50</option>
                                    <option>52</option>
                                    <option>54</option>
                                    <option>56</option>
                                    <option>58</option>
                                    <option>60</option>
                                    <option>62</option>
                                </select>
                            </div>
                </div>
                <div className="col-6 col-md-3 filter-height">

                  <div style={{right: '13px'}} className="col-6 col-md-3 filter-height">
                    <div className="right-10 pos-tb-center">
                                  <select style={{width: '490%'}} className="form-control input-sm">
                                      <option>Årgang</option>
                                      <option>Før</option>
                                      <option>2008</option>
                                      <option>2009</option>
                                      <option>2010</option>
                                      <option>2011</option>
                                      <option>2012</option>
                                      <option>2013</option>
                                      <option>2014</option>
                                      <option>2015</option>
                                      <option>2016</option>
                                      <option>2017</option>
                                  </select>
                              </div>
                  </div>
                </div>
                <div className="col-6 col-md-3 filter-height">

                  <div style={{right: '31px'}} className="col-6 col-md-3 filter-height">
                    <div className="right-10 pos-tb-center">
                                  <select style={{width: '494%'}} className="form-control input-sm">
                                      <option>Sorter Efter</option>
                                      <option>Nyeste</option>
                                      <option>Pris: Lav til Høj</option>
                                      <option>Pris: Høj til Lav</option>
                                  </select>
                              </div>
                  </div>
                </div>

              </div>

            </div>

          </div>
      </div>

    <div className="ptb-30 prl-30">
        <div className="row row-tb-20">


                  {(this.props.category == null) ? null :
                  this.props.category.map((bike, i) => {
                    return (
                      <div key={i} className="col-sm-6 col-md-4 col-lg-3">

                        <div className="coupon-single panel t-center salg-shadow">
                          <div className="row">
                            <div className="col-xs-12">
                              <div className="text-center p-20">
                                <a href="#">
                                <img src={bike.attachments[0]}/>
                                </a>
                              </div>

                            </div>


                            <div style={{maxHeight: '220px', minHeight: '220px'}} className="col-xs-12">
                              <div className="panel-body">
                                <ul className="deal-meta list-inline mb-10">
                                  <li style={{textTransform: 'capitalize'}} className="color-muted"><i className="ico fa fa-tag mr-5"></i>{bike.brand}</li>
                                  <li className="color-muted"><i className="ico fa fa-cube mr-5"></i>{bike.size}</li>
                                  <li className="color-muted"><i className="ico fa fa-thumb-tack mr-5"></i>{bike.year}</li>

                                </ul>

                                <h4 className="color-green mb-10 t-uppercase">DKK {bike.price}.00</h4>
                                <h5 className="deal-title mb-10">
                                  <a href="#">{bike.title}</a>
                                </h5>
                                <ul className="deal-meta list-inline mb-10">
                                  <li style={{textTransform: 'capitalize'}} className="color-muted"><i className="ico fa fa-map-marker mr-5"></i>{bike.location}</li>
                                  <br/>
                                  <li className="color-muted"><i className="ico fa fa-user-circle mr-5"></i>{bike.name}</li>
                                </ul>



                                <div className="showcode">
                                  <button className="btn btn-sm btn block more-info">Vis Mere</button>
                                  <a href={bike.link} target="_blank"><button className="btn btn-sm btn block more-info">Kontakt Info</button></a>


                                </div>
                              </div>
                            </div>

                          </div>

                        </div>

                      </div>

                    )
                  })

                  }




                              </div>
                          </div>

                      </div>


                  </div>
              </div>

</main>



      </div>
    )
  }
}

const stateToProps = (state) => {
  return {
    category: state.category.allBikes
  }
}

const dispatchToProps = (dispatch) => {
  return {
    getAllBikes: (bike) => dispatch(actions.getAllBikes(bike))
  }
}

export default connect(stateToProps, dispatchToProps)(Category)

1 个答案:

答案 0 :(得分:0)

如果您使用的是React Router v3或v2,则可以从传递给组件的location.query对象访问查询字符串参数。
例如:

<Route path="category" component={Category} />

然后在您的Category组件中,您可以执行this.props.location.query.year等...

修改
忘了提到反应路由器v4不支持这个。你可以阅读其他解决方案here

编辑#2
在评论中跟随你的其他问题:
鉴于您发布的网址:
localhost:3000/category?year=2000&size=XL&brand=cervelo
访问this.props.location.query.year将返回2000
this.props.location.query.brand将返回cervelo等等......