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

React中API返回数据无法渲染至JSX的问题求助

解决思路

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

你的appointments?.map回调使用大括号{}但未返回JSX元素,React无法渲染内容。两种修复方式:

  • 替换大括号为小括号(自动返回):
appointments?.map(appt => (
    <div key={appt.id}>
        <h2>{appt.start_datetime}</h2><br></br>
        <h2>{appt.teacher.first_name}</h2><br></br>
        <h2>{appt.status}</h2>
    </div>
))
  • 或在大括号内添加return:
appointments?.map(appt => {
    return (
        <div key={appt.id}>
            <h2>{appt.start_datetime}</h2><br></br>
            <h2>{appt.teacher.first_name}</h2><br></br>
            <h2>{appt.status}</h2>
        </div>
    )
})

2. 触发API请求函数

你定义了getAppointmentsForTeacherForDate但未在组件挂载或参数变化时调用,导致appointments始终为空数组。用useEffect钩子触发请求:

import React, { useState, useEffect } from "react";
// 保留其他导入代码

export default function Appointments({ teacher_id, date }) {
    const [appointments, setAppointments] = useState([]);

    function updateAppointments(data) {
        setAppointments(data);
    }

    function getAppointmentsForTeacherForDate(teacher_id, date) {
        // 修正URL变量错误:${teacher}改为${teacher_id}
        axios.get(`http://localhost:3000/api/v1/teachers/${teacher_id}/appointmentsForDate/`,
          { params: { teacher_id: teacher_id, date: date }},
          {withCredentials: true}
        ).then(response => {
          if (response.data.appointments) {
            updateAppointments(response.data.appointments);
          } else {
            console.log("Failed to get appointments for teacher");
          }
        })
    }

    // 组件挂载或teacher_id/date变化时执行请求
    useEffect(() => {
        if (teacher_id && date) {
            getAppointmentsForTeacherForDate(teacher_id, date);
        }
    }, [teacher_id, date]);
    
    // 保留返回部分代码
}

3. 修正API请求URL的变量错误

请求URL中${teacher}是未定义变量,需改为${teacher_id},否则会导致请求路径错误(即使你说API返回了数据,大概率是代码笔误)。

4. 可选:添加状态提示提升体验

添加加载状态和无预约提示,避免页面空白:

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

// 修改请求函数添加状态控制
function getAppointmentsForTeacherForDate(teacher_id, date) {
    setLoading(true);
    axios.get(`http://localhost:3000/api/v1/teachers/${teacher_id}/appointmentsForDate/`,
      { params: { teacher_id: teacher_id, date: date }},
      {withCredentials: true}
    ).then(response => {
      setLoading(false);
      if (response.data.appointments) {
        updateAppointments(response.data.appointments);
      } else {
        console.log("Failed to get appointments for teacher");
      }
    }).catch(err => {
        setLoading(false);
        console.error("请求出错:", err);
    })
}

// 修改返回部分
return (
    <>
        <div>
            {loading && <p>加载中...</p>}
            {!loading && appointments.length === 0 && <p>暂无预约</p>}
            {!loading && appointments?.map(appt => (
                <div key={appt.id}>
                    <h2>{appt.start_datetime}</h2><br></br>
                    <h2>{appt.teacher.first_name}</h2><br></br>
                    <h2>{appt.status}</h2>
                </div>
            ))}
        </div>
    </>
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 17:43:19