繁体   English   中英

使用react-data-grid将React.createClass方法适应ES6类组件

[英]Adapt React.createClass method to ES6 Class Component with react-data-grid

我正在使用react-data-grid库在react中创建一个可过滤的数据表 他们所有的示例都使用已贬值的React.createClass方法,而我正在尝试重构为ES6类组件。

具体来说,我正在尝试重构Filterable Grid示例:

我的重构代码如下所示:

import React from 'react'
import ReactDataGrid from 'react-data-grid'
const { Toolbar, Data: { Selectors } } = require('react-data-grid-addons')

class FilterableTable extends React.Component {
  constructor(props) {
    super(props);

    this._columns = [
      {
        key: 'id',
        name: 'ID',
        width: 80
      },
      {
        key: 'task',
        name: 'Title',
        editable: true
      },
      {
        key: 'priority',
        name: 'Priority',
        editable: true
      },
      {
        key: 'issueType',
        name: 'Issue Type',
        editable: true
      },
      {
        key: 'complete',
        name: '% Complete',
        editable: true
      },
      {
        key: 'startDate',
        name: 'Start Date',
        editable: true
      },
      {
        key: 'completeDate',
        name: 'Expected Complete',
        editable: true
      }
    ];

    this.state = { rows: this.createRows(1001), filters: {} };
    console.log(this.state);
  }


  getRandomDate = (start, end) => {
    return new Date(start.getTime() + Math.random() * (end.getTime() - start.getTime())).toLocaleDateString();
  }

  createRows = () => {
    let rows = [];
    for (let i = 1; i < 1000; i++) {
      rows.push({
        id: i,
        task: 'Task ' + i,
        complete: Math.min(100, Math.round(Math.random() * 110)),
        priority: ['Critical', 'High', 'Medium', 'Low'][Math.floor((Math.random() * 3) + 1)],
        issueType: ['Bug', 'Improvement', 'Epic', 'Story'][Math.floor((Math.random() * 3) + 1)],
        startDate: this.getRandomDate(new Date(2015, 3, 1), new Date()),
        completeDate: this.getRandomDate(new Date(), new Date(2016, 0, 1))
      });
    }

    return rows;
  }

  getRows = () => {
    return Selectors.getRows(this.state);
  }

  getSize = () => {
    return this.getRows().length;
  }

  rowGetter = ( rowIdx ) => {
    let rows = this.getRows();
    return rows[rowIdx];
  }

  handleFilterChange = ({ filter }) => {
    let newFilters = Object.assign({}, this.state.filters);
    if (filter.filterTerm) {
      newFilters[filter.column.key] = filter;
    } else {
      delete newFilters[filter.column.key];
    }
    this.setState({ filters: newFilters });
  }

  onClearFilters = () => {
    // all filters removed
    this.setState({filters: {} });
  }

  render() {
    return (
      <ReactDataGrid
        columns={this._columns}
        rowGetter={this.rowGetter}
        enableCellSelect={true}
        rowsCount={this.getSize()}
        minHeight={800}
        toolbar={<Toolbar enableFilter={true}/>}
        onAddFilter={this.handleFilterChange}
        onClearFilters={this.onClearFilters} />);
  }

}

export default FilterableTable

问题:

单击筛选器按钮时会出现问题-呈现了新的标题行(通过工具栏组件),但是没有输入字段。 此屏幕快照并排显示了两个示例-我的ES6版本在顶部,而createClass版本在底部: 屏幕截图比较

我不确定是什么原因造成的,但是我可能感觉是由于我导入Toolbar的方式引起的? 任何帮助或朝着正确方向的观点将不胜感激! (以及重构该组件的任何其他建议。)

要为给定的列启用过滤,您需要为该列设置filterable = true。 因此,将filterable:true添加到this._columns中的每个对象。 有关更多信息,请检查http://adazzle.github.io/react-data-grid/examples.html#/filterable-grid

this._columns = [
  {
    key: 'id',
    name: 'ID',
    width: 80
  },
  {
    key: 'task',
    name: 'Title',
    editable: true,
    filterable:true
  },
  {
    key: 'priority',
    name: 'Priority',
    editable: true,
    filterable:true
  },
  {
    key: 'issueType',
    name: 'Issue Type',
    editable: true,
    filterable:true
  },
  {
    key: 'complete',
    name: '% Complete',
    editable: true,
    filterable:true
  },
  {
    key: 'startDate',
    name: 'Start Date',
    editable: true,
    filterable:true
  },
  {
    key: 'completeDate',
    name: 'Expected Complete',
    editable: true,
    filterable:true
  }
];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM