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

React中Antd Table自定义过滤:如何使用valuations返回的数组

解决Antd Table自定义过滤时的数据复用问题

我来帮你搞定这个问题!你现在的核心困扰是格式化后的valArray只能在get valuations()里用,没法拿到外部做过滤逻辑,其实是因为getter是计算属性,每次访问都会重新生成新数组,而且没有持久化存储,所以存state没成功大概率是时机不对。

咱们一步步来改:

第一步:把格式化逻辑抽成可复用的方法

先把原来的getter改成普通方法,这样不管是初始化还是过滤时都能调用:

// 抽成单独的格式化方法,复用性更强
formatValuations = () => {
  const { valuation } = this.props;
  // 用map替代for循环,代码更简洁
  return valuation.map(item => ({
    date: item.registered_date,
    name: item.full_name,
    year: item.year
  }));
};

第二步:用state持久化存储格式化后的数据

在组件的state里新增三个状态:存格式化后的原始数据、过滤后的结果,还有过滤关键词:

state = {
  originalValuations: [], // 存格式化后的原始数据,避免重复计算
  filteredValuations: [], // 存过滤后的结果,给Table用
  filterText: '' // 过滤输入框的关键词
};

然后在组件挂载和props更新时,更新原始数据的state:

componentDidMount() {
  // 组件挂载时初始化数据
  const formatted = this.formatValuations();
  this.setState({
    originalValuations: formatted,
    filteredValuations: formatted
  });
}

componentDidUpdate(prevProps) {
  // 当props里的valuation变化时,重新格式化并更新state
  if (prevProps.valuation !== this.props.valuation) {
    const formatted = this.formatValuations();
    this.setState({
      originalValuations: formatted,
      filteredValuations: formatted
    });
  }
}

第三步:实现过滤逻辑

写一个处理过滤输入的方法,根据输入的关键词对原始数据进行过滤:

handleFilterChange = (e) => {
  const filterText = e.target.value.trim().toLowerCase();
  const { originalValuations } = this.state;
  
  // 根据关键词过滤,这里可以根据你的需求调整过滤规则
  const filtered = originalValuations.filter(item => 
    item.name.toLowerCase().includes(filterText) ||
    item.date.includes(filterText) ||
    item.year.toString().includes(filterText)
  );
  
  this.setState({ filterText, filteredValuations: filtered });
};

第四步:更新render部分,添加过滤输入框和绑定数据

最后在render里加上过滤输入框,Table的dataSource改用state里的filteredValuations:

render() {
  const columns = [
    { title: "Date", dataIndex: "date" },
    { title: "Name", dataIndex: "name" },
    { title: "Year", dataIndex: "year" }
  ];

  return (
    <div style={{ padding: '16px' }}>
      {/* 过滤输入框 */}
      <input
        type="text"
        placeholder="输入关键词过滤..."
        value={this.state.filterText}
        onChange={this.handleFilterChange}
        style={{ marginBottom: '16px', padding: '8px', width: '200px' }}
      />
      {/* Table用过滤后的数据源 */}
      <Table columns={columns} dataSource={this.state.filteredValuations} rowKey="date" />
    </div>
  );
}

为什么原来的getter不行?

原来的get valuations()是计算属性,每次访问this.valuations都会重新执行一遍循环生成新数组,不仅性能有损耗,而且这个数组没有被持久化存储,你没法在外部拿到同一个引用去做过滤修改。把数据存在state里后,我们就能完全控制数据的流转,过滤逻辑也能基于稳定的原始数据来处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:59:00