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

React Modal中使用array.map渲染组件不显示问题求助

问题:Modal中通过map渲染ProductCard组件不显示,API返回正常

点击打开Modal时,希望从API获取数据并通过array.map渲染多个ProductCard组件,但组件始终不显示。API返回状态码200正常,代码实现如下:

状态定义

const [visible, setVisible] = useState(false);

const toggleVisible = () => {
   setVisible(!visible);
};

const [app, setApp] = useState([])

useEffect(() => {
  const getApps = async () => {
    try {
      const response = await axios.get("http://192.168.20.2:3000/api/V1/application")
      setApp(response.data)
    } catch (error) {
      console.log("Error cannot get api application")
    }
  }

  if (visible) {
    getApps()
  }
}, [visible])

返回部分代码

return (
<div>
  <div className="font-sans">
    <Modal
      open={visible}
      onClickBackdrop={toggleVisible}
      className="w-11/12 max-w-7xl space-y-10 px-24 pb-20"
    >
      <Modal.Header>
        <div className="grid grid-cols-2">
          <div className="grid col-span-1 place-content-start">
            <h1 className="text-4xl font-bold">Smart</h1>
          </div>
          <div className="grid col-span-1 place-content-end">
            <Form>
              <Input className="rounded-full" bordered type="text" placeholder="Search" />
            </Form>
          </div>
        </div>
      </Modal.Header>
      <Modal.Body className="space-y-10">
        <div className="grid grid-cols-3">
          {
            app?.map(app => {
              <ProductCard
                title={app.title}
                subTitle={app.subTitle}
              />
            })
          }
        </div>
      </Modal.Body>
    </Modal>
  </div>
</div>
);

解决方案

1. 修复map函数的返回值问题

你的map回调函数没有返回ProductCard组件,React无法渲染任何内容。有两种修复方式:

  • 方式一:添加return语句
app?.map(app => {
  return <ProductCard
           title={app.title}
           subTitle={app.subTitle}
         />
})
  • 方式二:使用箭头函数的隐式返回(去掉花括号)
app?.map(app => (
  <ProductCard
    title={app.title}
    subTitle={app.subTitle}
  />
))

2. 添加唯一key属性

React要求列表渲染的元素必须有唯一的key属性,这能帮助React识别列表项的变化,避免不必要的重渲染,同时消除控制台警告。假设你的API返回的每个app对象有唯一的id字段:

app?.map(app => (
  <ProductCard
    key={app.id}
    title={app.title}
    subTitle={app.subTitle}
  />
))

3. 可选:添加加载状态优化体验

在API请求过程中,可以添加加载提示,避免用户看到空白内容:

// 新增加载状态
const [loading, setLoading] = useState(false);

// 修改getApps函数
const getApps = async () => {
  try {
    setLoading(true);
    const response = await axios.get("http://192.168.20.2:3000/api/V1/application")
    setApp(response.data)
  } catch (error) {
    console.log("Error cannot get api application")
  } finally {
    setLoading(false);
  }
}

// 在渲染时判断加载状态
<Modal.Body className="space-y-10">
  <div className="grid grid-cols-3">
    {loading ? (
      <div>加载中...</div>
    ) : (
      app?.map(app => (
        <ProductCard
          key={app.id}
          title={app.title}
          subTitle={app.subTitle}
        />
      ))
    )}
  </div>
</Modal.Body>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:25:24