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

React TS中Filter Context返回对象异常,请求技术排查

问题排查与修复

核心问题:打印的是函数引用而非执行结果

你在Filter组件中直接打印了FilterState这个函数本身,而没有调用它获取实际的状态值。修改打印代码:

// 原代码
console.log(JSON.stringify(FilterState));
// 改为
console.log(JSON.stringify(FilterState()));

必要检查:确保组件在Provider范围内

你的Filter组件必须被FilterContext组件包裹,否则useFilterInfo会返回上下文的默认值(空对象),导致调用FilterState()时出错。在根组件或父组件中正确使用Provider:

import { FilterContext } from './path/to/FilterContext';
import { Filter } from './path/to/Filter';

function App() {
  return (
    <FilterContext>
      <Filter />
      {/* 其他需要使用筛选状态的组件 */}
    </FilterContext>
  );
}

类型定义优化(消除隐患)

原FilterProvider接口中FilterState的返回值类型定义不准确,改为明确返回Shoes类型,避免类型断言带来的潜在问题:

interface FilterProvider {
    FilterState: () => Shoes; // 替换原有的()=>{}
    updateGenderState: (value: string)=>void;
    updateBrandState: (value: string)=>void;
}

同时可以优化useFilterInfo钩子,确保组件在Provider范围内使用时才生效,避免静默错误:

export const useFilterInfo = ()=>{
    const context = useContext(FilterProvider);
    if (!context) {
        throw new Error('useFilterInfo 必须在 FilterContext 组件内部使用');
    }
    return context;
}

补充update函数实现(可选)

如果需要实际修改筛选状态,完善updateGenderState和updateBrandState的逻辑:

const updateGenderState = (value: string)=>{
    setFilterState(prev => ({
        ...prev,
        gender: prev.gender.map(item => 
            item.gender === value ? {...item, checked: !item.checked} : item
        )
    }));
}

const updateBrandState = (value: string)=>{
    setFilterState(prev => ({
        ...prev,
        brand: prev.brand.map(item => 
            item.brand === value ? {...item, checked: !item.checked} : item
        )
    }));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:42:47