React渲染时用filter函数导致useEffect未触发问题求助
问题分析与解决建议
潜在错误:未处理属性不存在的情况
当后端返回的任务对象中,vehicle或customer_mobile字段不存在、为null或undefined时,调用.includes(query)会抛出TypeError,导致组件渲染失败,看起来像是jobs状态被重置。修改过滤函数,先判断属性是否存在:const filteredJobs = () => { return jobs.filter((job) => keys.some((key) => { const value = job[key]; return value && value.includes(query); }) ); };优化过滤函数的写法
原函数接收jobs参数,但实际使用的是组件内部的jobs状态,完全可以去掉参数,避免不必要的混淆:// 去掉jobs参数,直接使用组件内的jobs状态 const filteredJobs = () => { return jobs.filter((job) => keys.some((key) => { const value = job[key]; return value && value.includes(query); }) ); }; // 渲染时直接调用 {filteredJobs().map((job) => ( <Grid key={job.id} item xs={4}> <JobCard job={job} handleError={handleError} /> </Grid> ))}用useMemo缓存过滤结果(可选但推荐)
每次query或jobs变化时才重新计算过滤结果,避免重复计算提升性能:import { useMemo } from 'react'; // ... const filteredJobs = useMemo(() => { return jobs.filter((job) => keys.some((key) => { const value = job[key]; return value && value.includes(query); }) ); }, [jobs, query, keys]); // 渲染时直接使用filteredJobs {filteredJobs.map((job) => ( <Grid key={job.id} item xs={4}> <JobCard job={job} handleError={handleError} /> </Grid> ))}验证initialValues的合理性
确保initialValues的结构与后端返回的任务列表结构一致,避免初始渲染时因结构不匹配导致的隐性错误。
内容的提问来源于stack exchange,提问作者Yusuf Mirza
相关产品推荐
相关产品推荐

