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

Next.js中如何将handleSubmit内请求的API数据传递给Canvas组件

你遇到的问题本质是局部变量作用域和React状态管理的问题,你在handleSubmit函数内部拿到的请求结果是函数内部的局部变量,离开这个函数作用域就无法被访问,自然没法传递给组件。


修复方案

你只需要新增一个React状态来存储接口请求返回的数据,拿到结果后写入状态,再把状态传给Canvas组件即可,修改后的完整代码如下:

import React, { useState, useEffect } from 'react'
import Layout from '../components/layout'
import Sidebar from '../components/sidebar'
import DatePicker from 'react-datepicker'
import Canvas from '../components/canvas'

import 'react-datepicker/dist/react-datepicker.css'

export default function Ground({ track: initialTrack }) {
  function epoch(date) {
    date = Date.parse(date)
    date = date / 1000
    return date
  }

  const [startDate, setStartDate] = useState(new Date())
  // 新增状态存储请求返回的track数据
  const [trackData, setTrackData] = useState(initialTrack || null)
  const rightThisSecond = Math.round(Date.now() / 1000)
  const beginDate = Math.round(Date.now(startDate) / 1000)

  const handleSubmit = async (e) => {
    e.preventDefault()

    const beginDate = epoch(startDate)
    const res = await fetch(
      `/api/tracks/timeseries/${beginDate}/${rightThisSecond}`
    )
    const track = await res.json()
    // 将请求结果写入状态,会自动触发组件重新渲染
    setTrackData(track)
  }
  return (
    <section>
      <h2>Layout Example (Ground)</h2>
      <form onSubmit={handleSubmit}>
        <DatePicker
          selected={startDate}
          onChange={(date) => setStartDate(date)}
        />
        <button type='submit'>Submit</button>
      </form>

      <section>
        {/* 加判断避免空数据传给组件报错,也可以自定义加载提示 */}
        {trackData ? <Canvas data={trackData} /> : <p>请选择日期提交查询</p>}
      </section>
    </section>
  )
}

Ground.getLayout = function getLayout(page) {
  return (
    <Layout>
      <Sidebar />
      {page}
    </Layout>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 21:48:03