You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React使用react-data-table-component过滤前filteredItems未定义问题咨询

问题根因

this.filteredItems仅在过滤事件触发时才会被赋值,首次渲染阶段没有初始化,同时直接用类实例属性存储渲染所需数据不符合React的状态管理逻辑,才会出现两种配置都不符合预期的情况。

修正方案

直接在render阶段通过props和state计算需要渲染的数据,无需额外用实例属性存储过滤结果,代码修改如下:

class Table extends React.Component {
  // 初始化state,过滤文本默认值为空
  constructor(props) {
    super(props);
    this.state = {
      filterText: ''
    };
    this.handleClear = this.handleClear.bind(this);
  }

  handleClear() {
    this.setState({ filterText: '' });
  }

  render() {
    // 注意:如果你的props本身就是列表数组,直接写 const result = this.props 即可
    const result = this.props;
    // 实时计算当前要展示的列表:过滤文本为空返回全部数据,不为空返回过滤后的数据
    const filteredItems = this.state.filterText
      ? result.filter(item =>
          item.name && item.name.toLowerCase().includes(this.state.filterText.toLowerCase())
        )
      : result;

    const getSubHeaderComponent = () => (
      <FilterComponent
        onFilter={(e) => {
          this.setState({ filterText: e.target.value });
        }}
        onClear={this.handleClear}
        filterText={this.state.filterText}
      />
    );

    return (
      <React.Fragment>
        <DataTable
          columns={columns}
          data={filteredItems}
          subHeader
          subHeaderComponent={getSubHeaderComponent()}
        />
      </React.Fragment>
    );
  }
}

方案说明

  • 去掉了对this.filteredItems实例属性的依赖,所有渲染所需数据直接通过state和props计算得到,符合React单向数据流规则
  • 首次渲染时过滤文本为空,直接返回props传入的全部原始数据,不会出现undefined问题
  • 过滤文本修改触发state更新后会自动重新计算过滤后的列表,无需手动赋值存储

内容的提问来源于stack exchange,提问作者user8779054

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:12:03