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

React+Redux项目搜索组件无法访问reducer数据报toLowerCase未定义错误

报错根因

错误出现在Businesses组件的过滤逻辑中:

let businessesMatch = businessesReducer.businesses.filter( (business ) => business.name.toLowerCase().includes(this.state.newSearch.toLowerCase()))

触发toLowerCase报错只有两种可能:

  • business本身是undefined
  • business存在但business.name是undefined

修复方案

1. 兼容异常判断,先阻止报错

把过滤逻辑改成带兜底的写法,不管是数据为空还是字段缺失都不会触发报错:

let businessesMatch = (businessesReducer?.businesses || []).filter( business => 
  business?.name?.toLowerCase().includes(this.state.newSearch.toLowerCase() || '') || false
)

2. 清洗接口返回的无效数据

你触发GET_ALL_BUSINESSES_SUCCESS时传入的action.businesses大概率存在不符合预期的项:要么数组里混了undefined值,要么部分商家数据没有name字段(比如后端字段名写错、返回空值),可以在reducer里加数据清洗逻辑:

case "GET_ALL_BUSINESSES_SUCCESS": 
  // 过滤掉没有id、name的无效商家数据
  const validBusinesses = (action.businesses || []).filter(item => item && item.id && item.name)
  return { 
    ...state,
    businesses: validBusinesses,
    isLoading: false
  }

3. 加载状态优化(可选)

可以复用reducer里的isLoading字段,接口请求未完成时展示加载状态,避免空状态下的异常渲染:

render() {
  const { businessesReducer} = this.props;
  // 加加载判断
  if (businessesReducer.isLoading) return <div>商家数据加载中...</div>

  // 原有逻辑
  let businessesMatch = (businessesReducer?.businesses || []).filter( business => 
    business?.name?.toLowerCase().includes(this.state.newSearch.toLowerCase() || '') || false
  )
  // ...剩下的返回逻辑
}

冗余代码优化(不影响报错,可选择修改)

BusinessCard组件不需要再通过connect绑定Redux的businessesReducer,你已经通过父组件props把单个business对象传入了,多余的connect可以删掉,减少不必要的组件重渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:27:01