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

WordPress Gutenberg中动态循环调用useSelect获取多分类数据报错求助

动态分类下Gutenberg useSelect的使用问题

问题描述

在Gutenberg开发场景中,需要动态获取多个自定义分类的记录。单个分类的获取逻辑正常:

const test = useSelect(
  (select) => wp.data.select('core').getEntityRecords('taxonomy', 'grammar1', { per_page: 100 }),
  []
);
console.log("test", test);

但当分类名称和数量动态生成(如terms = ["grammar1", "grammar2", "grammar3"]),尝试通过循环调用useSelect批量获取时:

const test2 = [];
terms.forEach((item) => {
  test2[item] = useSelect(
    (select) => wp.data.select('core').getEntityRecords('taxonomy', item, { per_page: 100 }),
    []
  );
});

触发Redux错误:Switching useSelect from mapping to mapping is not allowed

问题原因

useSelect作为基于React useCallback的自定义钩子,必须严格遵守React钩子规则:钩子只能在组件的顶层作用域调用,不能在循环、条件判断或嵌套函数内执行。上述循环调用useSelect的写法违反了这一规则,导致Redux状态管理出现错误。

可行解决方案

将批量获取逻辑整合到单个useSelect调用中,通过遍历分类数组一次性获取所有数据:

// 假设terms为动态获取的分类数组
const terms = ["grammar1", "grammar2", "grammar3"];

const taxonomyRecords = useSelect((select) => {
  const coreSelect = select('core');
  // 用reduce生成以分类名为键的记录对象
  return terms.reduce((records, taxonomy) => {
    records[taxonomy] = coreSelect.getEntityRecords('taxonomy', taxonomy, { per_page: 100 });
    return records;
  }, {});
}, [terms]); // 将terms作为依赖项,分类变化时重新获取数据

console.log("taxonomyRecords", taxonomyRecords);

说明

  • 该写法符合React钩子规则,在组件顶层调用useSelect,内部通过reduce批量处理多个分类的请求。
  • 依赖数组[terms]确保当分类列表动态变化时,useSelect会重新执行并更新数据。
  • 返回的taxonomyRecords是一个对象,键为分类名,值为对应分类的记录数组,可直接通过taxonomyRecords.grammar1访问对应数据。

如果分类数量极大,前端批量请求可能存在性能问题,此时后端自定义接口一次性返回所有数据的备选方案依然可取,但上述前端方案已能满足常规场景的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 01:35:19