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

返回组件数组的React Custom Hook是否属于不良开发模式?

结论

你实现的这个返回组件数组的React自定义Hook 不属于不良开发模式,这是动态渲染配置化区块的常见实现思路,没有违反React的Hook使用规则,完全可以正常运行。

可优化调整点

下面是几个可以优化的方向,能让代码更易维护、更符合React的通用开发习惯:

  • 用映射表替换switch分支
    当前的switch语句每新增一种区块类型就要新增一个case,维护成本更高,改成静态映射表后扩展更方便,代码也更简洁:
import React from "react";
import { Image, Paragraph, Header } from "../../components/Blocks";

// 区块类型和组件的映射表
const blockComponentMap = {
  image: Image,
  paragraph: Paragraph,
  heading: Header
} as const;

export const useBlocks = (blocks: Item[]) => {
  return blocks.map((item) => {
    const Component = blockComponentMap[item.name];
    return Component ? <Component key={item.order} data={item.data} /> : null;
  });
};
  • 优先封装为组件而非Hook
    你当前的Hook没有用到任何React内置Hook(比如useState、useEffect、useMemo等),本质就是一个纯数据转换函数,封装成独立的渲染组件更符合React的使用习惯,调用也更直观:
import React from "react";
import { Image, Paragraph, Header } from "../../components/Blocks";

const blockComponentMap = {
  image: Image,
  paragraph: Paragraph,
  heading: Header
} as const;

// 直接封装为渲染组件
export const BlockRenderer = ({ blocks }: { blocks: Item[] }) => {
  return blocks.map((item) => {
    const Component = blockComponentMap[item.name];
    return Component ? <Component key={item.order} data={item.data} /> : null;
  });
};

// 父组件使用示例:
// <BlockRenderer blocks={你的区块配置数组} />
  • 可选增加类型校验
    可以给Item类型的name字段加枚举限制,或者增加类型守卫逻辑,避免传入不存在的区块类型时出现运行时问题,TS场景下也能获得更好的类型提示。

适合保留Hook形式的场景

如果你后续需要给区块增加统一的状态逻辑,比如监听区块可见性、添加统一的交互状态、需要结合useInView、useRequest等其他Hook做额外逻辑处理,那保留Hook的形式是完全合理的,可以把相关逻辑内聚在Hook中,避免散落在父组件里。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 03:27:04