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

数组过滤报错:Uncaught TypeError: 无法读取undefined的toLowerCase属性

Redux Toolkit 筛选功能错误排查与修复

1. 兜底 action.payload 解构

调用 dispatch(FILTER_ENTRIES) 时若未传入完整的entries或search,会直接导致解构报错。给参数加默认值避免此问题:

FILTER_ENTRIES(state, action) {
  // 给entries默认空数组,search默认空字符串
  const { entries = [], search = '' } = action.payload;
  const tempEntries = entries.filter((entry) => {
    const entryTitle = entry?.title?.toLowerCase() || '';
    const entryAuthor = entry?.author?.toLowerCase() || '';
    const searchText = search.toLowerCase();
    return entryTitle.includes(searchText) || entryAuthor.includes(searchText);
  });
  state.filteredEntries = tempEntries;
}

2. 彻底处理字段空值

即使使用可选链?.,若entry.title为null,调用toLowerCase()仍会报错。将空值转为空字符串再处理:

const entryTitle = entry?.title ? entry.title.toLowerCase() : '';
const entryAuthor = entry?.author ? entry.author.toLowerCase() : '';

3. 验证Store注册正确性

确保filter reducer已正确添加到Redux Store,且reducer的key与selectFiltered中的state.filter一致:

// store配置示例
import { configureStore } from '@reduxjs/toolkit';
import filterReducer from './path/to/filterSlice';

export const store = configureStore({
  reducer: {
    filter: filterReducer, // 此处key必须为filter
    // 其他reducer...
  },
});

4. 确保调用时机合理

如果在组件初始化时触发筛选,需等待entries数据加载完成后再调用dispatch,避免传入未初始化的空值:

// React组件中示例
import { useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { FILTER_ENTRIES } from './filterSlice';

function YourComponent() {
  const dispatch = useDispatch();
  const [entries, setEntries] = useState([]);

  useEffect(() => {
    // 模拟数据请求
    fetch('/api/entries')
      .then(res => res.json())
      .then(data => {
        setEntries(data);
        // 数据加载完成后触发筛选
        dispatch(FILTER_ENTRIES({ entries: data, search: '' }));
      });
  }, [dispatch]);

  // ...组件其他逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:15:40