Я работал над проектом, который включал таблицы и настраиваемую разбивку на страницы. Итак, для таблиц я сравнивал фиксированную таблицу facebook и griddle, но почему-то испытал соблазн использовать таблицу фиксированных данных после прочтения обзоров и понимания их функций.

Итак, приступим. Сначала вам нужно установить fixed-data-table. Давайте воспользуемся npm и быстро установим его.

npm install fixed-data-table
import 'fixed-data-table/dist/fixed-data-table.min.css'

Итак, теперь создайте тупой компонент, который принимает всю информацию как свойства и просто отображает таблицу с этой информацией. В этом компоненте не должно быть никакой работы, кроме нужных вам фильтров, к которым мы вернемся позже. Итак, теперь давайте создадим тупой компонент: -

/*Dumb component that just renders a table with input parameters*/
import React,{Component,PropTypes} from 'react'
import ReactTableCustomTextField from './ReactTableCustomTextField'
import  {Table,Column,Cell} from 'fixed-data-table'
import 'fixed-data-table/dist/fixed-data-table.min.css'
const propTypes = {
  pageCount : PropTypes.number.isRequired,
  totalEmployees : PropTypes.number.isRequired,
  limit : PropTypes.number.isRequired,
  rowHeight: PropTypes.number.isRequired,
  headerHeight:PropTypes.number.isRequired,
  width : PropTypes.number.isRequired,
  height: PropTypes.number.isRequired,
  data: PropTypes.array.isRequired,
  headerFields: PropTypes.array.isRequired
}
class ReactTable extends Component{
renderColumns(headerFields,data){
      return headerFields.map(datum=>{
        return <Column
             key={datum.id} header={<Cell>{datum.header}</Cell>}
             cell={
               <ReactTableCustomTextField
                 data={data}
                 field={datum.field}
               />
             }
             width={200}
        />
      })
  }
render(){
    const { pageCount,totalEmployees,limit } = this.props
    const { rowHeight,headerHeight,width,height} = this.props
    const { data } = this.props
    const { headerFields } = this.props
return(
      <Table
       rowsCount={limit}
       rowHeight={rowHeight}
       headerHeight={headerHeight}
       width={width}
       height={height}>
        {this.renderColumns(headerFields,data)}
      </Table>
    )
  }
}
ReactTable.propTypes = propTypes
export default ReactTable

Теперь у вас есть компонент, который отображает тупой компонент, поэтому просто импортируйте его в компонент и передайте ему всю информацию.

Давайте создадим образец компонента, скажем X.

import React,{Component,PropTypes} from 'react'

class X extends Component{
render(){
     <ReactTable data={data} limit={limit}
     rowHeight={50} headerHeight={50} width={1200} height={500}
        headerFields={//array of objects container header and data for columns}
        pageCount={pageCount}/>
  }
}
EmployeeList.propTypes = propTypes
export default EmployeeList

Теперь headerFields - это массив объектов, в котором я сохраняю заголовок, а поля являются ключевыми. Используя это, мы могли бы создать столбцы таблицы и поместить данные. Если вы увидите метод renderColumns в ReactTable, вы поймете, что я пытаюсь сказать.

Теперь вы можете передавать информацию. Все идет нормально!!!!.

Но откуда вы берете эту информацию? Теперь, когда компонент X монтируется, мы вызовем API в componentWillMount () и отправим действие для обновления состояния с данными. Мы можем добавить следующее к компоненту X

componentWillMount(){
//dispatch your action here to call api and update data
}

Теперь у вас есть данные в вашем магазине, теперь давайте добавим пользовательский компонент нумерации страниц в ваш компонент x. Я использовал для этого response-paginate.

Давайте сначала установим response-paginate.

npm install react-paginate

Теперь добавьте следующее к вашему компоненту X.

<ReactPaginate previousLabel={"previous"}
                nextLabel={"next"}
                breakLabel={<a href="">...</a>}
                breakClassName={"break-me"}
                pageNum={pageCount}
                marginPagesDisplayed={2}
                pageRangeDisplayed={5}
                clickCallback={this.handlePageClick.bind(this)}
                containerClassName={"pagination"}
                subContainerClassName={"pages pagination"}
                activeClassName={"active"} />

React-paginate поставляется с функцией щелчка дескриптора обратного вызова, которая передает вам страницу страницы. Итак, давайте поместим это в компонент: -

handlePageClick(data){
    const { dispatch } = this.props
    //data.selected gives the current page.
   //dispatch the action here to call your api and update the state with new data
} 

Когда вы отправляете действие здесь и вызываете API с новым смещением / лимитом или страницей в соответствии с соглашением, вы следите за изменениями данных таблицы.

То же самое можно сделать и для фильтрации. При изменении флажка вы можете отправить действие для обновления объекта состояния и изменения вашей таблицы.

Теперь создайте компонент-контейнер для вашего X-компонента и получите данные из магазина. Затем передайте эти данные в качестве свойств тупому компоненту X.

function mapStateToProps(state){
   const {data} = state
   return{
    data
  }
}
class XContainer extends Component{render(){
    return(
      <X {...this.props}/>
    )
}}
export default connect(mapStateToProps)(XContainer)

Теперь ваш магазин подключен к вашему компоненту. Любое изменение фильтра / разбивки на страницы должно обновить ваше состояние.