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

如何在useEffect Hook中运行独立函数?多条件职位筛选组件疑问

多条件筛选组件解决方案

核心问题在于你之前的工作类型筛选直接基于当前jobs(可能已是筛选后的结果)过滤,导致取消选中时无法回到原始列表。正确思路是将所有筛选条件维护为状态,统一基于原始jobs列表在useEffect中完成多条件联合筛选。

步骤1:添加工作类型选中状态

在父组件中新增状态存储选中的工作类型:

const [selectedJobTypes, setSelectedJobTypes] = useState([]);

步骤2:修改筛选处理函数

filterJobsByTypeHandler无需直接过滤职位,仅负责更新选中状态即可:

const filterJobsByTypeHandler = useCallback((jobTypes) => {
  setSelectedJobTypes(jobTypes);
}, []);

用useCallback包裹是为了避免子组件WorkType不必要重渲染,setSelectedJobTypes是React提供的稳定函数,所以依赖数组为空。

步骤3:统一多条件筛选逻辑

更新原有useEffect,加入工作类型筛选逻辑,所有条件均基于原始jobs列表判断:

useEffect(() => {
  const newFilteredJobs = jobs.filter((job) => {
    // 关键词匹配
    const matchesSearch = job.title.toString().toLowerCase().includes(searchField.toLowerCase());
    // 职位类别匹配
    const matchesCategory = job.category.toString().toLowerCase().includes(categorySearchField.toLowerCase());
    // 工作类型匹配:选中列表为空则全部通过,否则检查是否在选中列表内
    const matchesType = selectedJobTypes.length === 0 
      ? true 
      : (job.jobType !== undefined && selectedJobTypes.includes(job.jobType.toString()));

    return matchesSearch && matchesCategory && matchesType;
  });
  setFilteredJobs(newFilteredJobs);
}, [jobs, searchField, categorySearchField, selectedJobTypes]);

步骤4:子组件WorkType交互逻辑

确保子组件在用户选中/取消选中时,传递完整的选中数组给父组件:

// WorkType组件示例
const WorkType = ({ onFilterJobsByType }) => {
  const [localSelectedTypes, setLocalSelectedTypes] = useState([]);

  const handleTypeToggle = (type) => {
    const newSelected = localSelectedTypes.includes(type)
      ? localSelectedTypes.filter(t => t !== type)
      : [...localSelectedTypes, type];
    setLocalSelectedTypes(newSelected);
    onFilterJobsByType(newSelected);
  };

  return (
    <div>
      {['Full-time', 'Part-time', 'Contract'].map(type => (
        <label key={type}>
          <input
            type="checkbox"
            checked={localSelectedTypes.includes(type)}
            onChange={() => handleTypeToggle(type)}
          />
          {type}
        </label>
      ))}
    </div>
  );
};

问题根源说明

你之前的filterJobsByTypeHandler直接用当前jobs过滤,但该jobs可能已经是关键词/类别筛选后的结果,取消选中时无法恢复原始列表。现在所有筛选逻辑基于原始jobs,通过状态控制生效条件,就能正确处理选中/取消选中的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 05:05:18