Я работал над проектом, который включал таблицы и настраиваемую разбивку на страницы. Итак, для таблиц я сравнивал фиксированную таблицу 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)
Теперь ваш магазин подключен к вашему компоненту. Любое изменение фильтра / разбивки на страницы должно обновить ваше состояние.