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

Next.js React报错:Objects are not valid as a React child,日期格式化求助

解决Next.js React中"Objects are not valid as a React child"错误并格式化日期

问题根源

  • pegaDia函数返回的是对象{ dia, n },React无法直接渲染对象类型的子元素,这就是报错的核心原因。
  • 调用pegaDia时错误传入了字符串"{ passagens.departure_date }",而非实际的日期变量passagens.departure_date。
  • useEffect未设置依赖数组,会导致组件无限重复调用loadPassagens,引发不必要的重复渲染。

解决方案

1. 修改pegaDia函数,返回格式化后的字符串

把函数返回值从对象改为拼接好的目标格式字符串:

export function pegaDia(str) {
  const monthNames = [
    "Jan", "Fev", "Mar", "Abr", "Mai", "Jun",
    "Jul", "Ago", "Set", "Out", "Nov", "Dez"
  ];

  const d = new Date(str);
  const monthAbbr = monthNames[d.getMonth()];
  const dia = d.getDate(); // 若加1是为了处理时区偏移,请确认场景后调整,避免31号加1变成32号的错误
  return `${dia} ${monthAbbr}`;
}

2. 修正pegaDia的调用参数

去掉多余的引号和花括号,直接传入实际日期变量:

<span>Ida {pegaDia(passagem.departure_date)}</span>

3. 修复useEffect的依赖数组

添加空数组作为依赖,确保数据仅在组件挂载时加载一次:

useEffect(() => {
  async function loadPassagens() {
    const response = await api.get("ZLIMIT_1?limit=10");
    setPassagens(response.data.slice(0, 10));
  }
  loadPassagens();
}, []);

完整修正后的代码

functions.js

export function pegaDia(str) {
  const monthNames = [
    "Jan", "Fev", "Mar", "Abr", "Mai", "Jun",
    "Jul", "Ago", "Set", "Out", "Nov", "Dez"
  ];

  const d = new Date(str);
  const monthAbbr = monthNames[d.getMonth()];
  const dia = d.getDate();
  return `${dia} ${monthAbbr}`;
}

Board.jsx

import Head from "next/head";
import styles from "./styles.module.scss";
import api from "../../services/api";
import { useEffect, useState } from "react";
import { pegaDia } from "./functions";

export default function Board() {
  const [passagens, setPassagens] = useState([]);

  useEffect(() => {
    async function loadPassagens() {
      const response = await api.get("ZLIMIT_1?limit=10");
      setPassagens(response.data.slice(0, 10));
    }
    loadPassagens();
  }, []);

  return (
    <>
      <Head>
        <title>Passagens Promocionais</title>
      </Head>

      <div className={styles.container}>
        <div className={styles.listapassagens}>
          {passagens.map((passagem) => {
            return (
              <article key={passagem.created}>
                <strong>{passagem.arrival_ap_city}</strong>
                <br />
                <span>Saindo de: {passagem.departure_ap_city}</span>
                <span>Ida {pegaDia(passagem.departure_date)}</span>
                <span>Volta {pegaDia(passagem.returning_date)}</span>
                <span>Preço {passagem.price_w_fees}</span>
              </article>
            );
          })}
        </div>
      </div>
    </>
  );
}

额外说明

  • 原代码中getDate()+1如果是为了处理UTC转本地时区的偏移,建议用toLocaleDateString等方式明确处理时区,避免直接加1导致日期越界。
  • map循环中将每一项命名为passagem而非和数组同名的passagens,避免变量名混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:50:31