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
相关产品推荐
相关产品推荐

