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

如何实现筛选后渲染React组件?附Redux文章组件代码

实现Redux驱动的文章筛选与组件重新渲染

嘿,我来帮你搞定这个按名称筛选文章并让组件重新渲染的需求~ 咱们先从现有代码的基础上一步步改造:

首先贴出你现有的组件代码方便对照:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import ArticleList from "../ArticlesListApp";
class Articles extends Component {
  render() {
    const { articleList } = this.props;
    return ( <ArticleList list={articleList} /> )
  }
}
function mapStateToProps(state) {
  return { articleList: state.articles };
}
export default connect(mapStateToProps)(Articles);

实现步骤详解

1. 给Redux状态添加筛选关键词

首先咱们需要在Redux的store里新增一个存储筛选关键词的状态,比如filterText。假设你的reducer原来长这样:

// 原articles reducer
const initialState = {
  articles: [] // 你的文章数组
};

export default function articlesReducer(state = initialState, action) {
  switch (action.type) {
    // 你原来的其他action类型
    default:
      return state;
  }
}

现在修改它,加入筛选状态的管理:

const initialState = {
  articles: [],
  filterText: '' // 新增筛选关键词状态
};

export default function articlesReducer(state = initialState, action) {
  switch (action.type) {
    case 'SET_FILTER_TEXT': // 新增更新筛选关键词的action类型
      return {
        ...state,
        filterText: action.payload
      };
    // 你原来的其他action类型
    default:
      return state;
  }
}

2. 创建对应的Action Creator

写一个简单的action creator来触发筛选关键词的更新:

// actions/articleActions.js
export const setFilterText = (text) => ({
  type: 'SET_FILTER_TEXT',
  payload: text
});

3. 修改Articles组件,添加筛选交互

现在把筛选按钮(或输入框)加到Articles组件里,并绑定触发action的逻辑:

import React, { Component } from 'react';
import { connect } from 'react-redux';
import { setFilterText } from './actions/articleActions'; // 导入刚才的action
import ArticleList from "../ArticlesListApp";

class Articles extends Component {
  handleFilterClick = (filterValue) => {
    // 点击按钮时触发action,传入对应的筛选值
    this.props.setFilterText(filterValue);
  };

  render() {
    const { filteredArticles } = this.props;
    return (
      <div>
        {/* 示例:预设几个筛选按钮,你可以根据实际需求调整 */}
        <button onClick={() => this.handleFilterClick('')}>全部</button>
        <button onClick={() => this.handleFilterClick('React')}>React相关</button>
        <button onClick={() => this.handleFilterClick('Redux')}>Redux相关</button>
        
        <ArticleList list={filteredArticles} />
      </div>
    )
  }
}

4. 修改mapStateToProps,实现数据筛选

这一步是核心:当Redux里的filterText变化时,咱们在mapStateToProps里对原始文章列表进行过滤,返回筛选后的结果。这样一旦筛选关键词变化,组件接收到的filteredArticles就会更新,从而触发重新渲染:

function mapStateToProps(state) {
  const { articles, filterText } = state;
  // 按名称筛选,假设文章对象的名称字段是title,你可以改成实际的字段名
  const filteredArticles = filterText 
    ? articles.filter(article => 
        article.title.toLowerCase().includes(filterText.toLowerCase())
      )
    : articles; // 筛选值为空时返回全部文章

  return { 
    filteredArticles
  };
}

// 把action creator映射到组件props里
export default connect(mapStateToProps, { setFilterText })(Articles);

原理说明

当你点击筛选按钮时,handleFilterClick会触发setFilterText action,Redux的reducer会更新filterText状态。mapStateToProps会监听state的变化,自动重新计算filteredArticles,并把新的筛选结果传给Articles组件。组件接收到新的props后,就会自动重新渲染,把筛选后的文章列表传给ArticleList组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:13:38