You need to enable JavaScript to run this app. React Native基于Redux State实现实时搜索筛选UI不更新如何解决
优惠活动
大模型
产品
解决方案
定价
更多

React Native基于Redux State实现实时搜索筛选UI不更新如何解决

问题根因
  • Array.filter() 本身是纯函数,不会修改原数组,只会返回过滤后的新数组,你原代码没有接收这个返回值,原始的companies(来自Redux的只读数据)根本没有发生变化,你观测到的控制台数据变化属于误判。
  • Redux通过useSelector返回的状态是只读的,直接修改不会触发组件重渲染,React组件UI更新依赖state/props的变更触发。
正确实现方案

不需要修改Redux源数据,新增本地状态存储搜索关键词,渲染时动态过滤数据即可,清空搜索词时会自动恢复全量列表,修改后的代码如下:

import { useState } from 'react';
const Home = (props) => {
  // 从Redux取原始全量数据,始终不修改它
  const originalCompanies = useSelector(state => state.companies.availableCompanies);
  // 新增本地状态存搜索关键词
  const [searchKeyword, setSearchKeyword] = useState('');

  const handleSearch = (e) => {
    // 只更新搜索关键词,触发组件重渲染
    setSearchKeyword(e);
  }

  // 渲染前动态过滤数据
  const showCompanies = searchKeyword.trim() === '' 
    ? originalCompanies 
    : originalCompanies.filter(el => el.name.includes(searchKeyword));
  // 优化点:如果要实现不区分大小写搜索,可以改成下面的写法
  // : originalCompanies.filter(el => el.name.toLowerCase().includes(searchKeyword.toLowerCase()));

  return (
      <>
        <SearchBar onChangeText={handleSearch} value={searchKeyword} />
        <View style={styles.cardContainer}>
          {showCompanies.map((el, index) => {
            return (
             <Card
              key={el.id}
              companyId={el.id}
              companyName={el.name}
              companyImage={el.image}
              companyMainAddress={el.mainAddress}
              companyPhoneNumber={el.telephoneNumber}
              companyDetails={el.details}
              onPress={() => {
                navigation.navigate('CardDetails', {
                id: el.id,
                companyName: el.name,
               });
             }}
            />
           )
         })}
       </View>
      </>
  )
}
补充说明

如果你的搜索功能需要跨页面共享状态,才需要把搜索关键词存入Redux,否则本地状态完全够用,性能也更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 20:06:06