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

React Router中如何在Home与ListScreen组件间传递API数据?

React Router 从Home组件向ListScreen组件传递API返回数据的方案

下面提供几种实用的实现方案,结合你的代码进行修改:

方案一:通过navigate的state参数传递数据

这是React Router中组件跳转传值的常用方式,适合一次性传递数据的场景。

修改Home组件的SubmitHandler

在API请求成功后,将返回的response.data通过navigate的第二个参数传递:

const SubmitHandler = (event) => {
    event.preventDefault()

    if(login.login_email.length < 1 || login.login_pwd.length < 4) {
        set_error(true)
    } else {
        axios.get(`https://localhost:7281/${login.login_email}/${login.login_pwd}`)
        .then(response => {
            console.log(response.status)

            if(response.status == 200) {
                // 传递API返回的数据到ListScreen
                navigate('/todo-list', {
                    state: { userData: response.data }
                })
            }
        })
    }
}

ListScreen组件接收数据

使用useLocation钩子获取传递过来的state数据:

import { useLocation } from "react-router-dom"

function ListScreen() {
    const location = useLocation()
    // 获取传递的用户数据,可选链避免未定义报错
    const userData = location.state?.userData

    // 后续基于userData进行查询操作
    return (
        <div>
            {userData && <div>当前用户数据:{JSON.stringify(userData)}</div>}
        </div>
    )
}

export default ListScreen

方案二:使用React Context全局管理数据

如果后续多个组件都需要用到该数据,推荐用Context做全局状态管理。

创建UserContext

// context/UserContext.js
import { createContext, useContext, useState } from "react"

const UserContext = createContext()

export function UserProvider({ children }) {
    const [userData, setUserData] = useState(null)

    return (
        <UserContext.Provider value={{ userData, setUserData }}>
            {children}
        </UserContext.Provider>
    )
}

export function useUser() {
    return useContext(UserContext)
}

在根组件中包裹UserProvider

确保路由组件被UserProvider包裹:

// App.jsx
import { UserProvider } from './context/UserContext'
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'
import Home from './Home'
import ListScreen from './ListScreen'

function App() {
    return (
        <UserProvider>
            <Router>
                <Routes>
                    <Route path="/" element={<Home />} />
                    <Route path="/todo-list" element={<ListScreen />} />
                </Routes>
            </Router>
        </UserProvider>
    )
}

修改Home组件存储数据

// Home.jsx
import { useUser } from './context/UserContext'

function Home() {
    const { setUserData } = useUser()
    // ...其他代码不变

    const SubmitHandler = (event) => {
        event.preventDefault()

        if(login.login_email.length < 1 || login.login_pwd.length < 4) {
            set_error(true)
        } else {
            axios.get(`https://localhost:7281/${login.login_email}/${login.login_pwd}`)
            .then(response => {
                console.log(response.status)

                if(response.status == 200) {
                    // 将数据存入Context
                    setUserData(response.data)
                    navigate('/todo-list')
                }
            })
        }
    }

    // ...返回部分不变
}

ListScreen组件获取数据

// ListScreen.jsx
import { useUser } from './context/UserContext'

function ListScreen() {
    const { userData } = useUser()

    // 后续基于userData进行查询操作
    return (
        <div>
            {userData && <div>当前用户数据:{JSON.stringify(userData)}</div>}
        </div>
    )
}

方案三:使用localStorage持久化存储数据

如果需要页面刷新后数据不丢失,可以将数据存入localStorage:

修改Home组件的SubmitHandler

const SubmitHandler = (event) => {
    event.preventDefault()

    if(login.login_email.length < 1 || login.login_pwd.length < 4) {
        set_error(true)
    } else {
        axios.get(`https://localhost:7281/${login.login_email}/${login.login_pwd}`)
        .then(response => {
            console.log(response.status)

            if(response.status == 200) {
                // 将数据存入localStorage
                localStorage.setItem('userData', JSON.stringify(response.data))
                navigate('/todo-list')
            }
        })
    }
}

ListScreen组件读取数据

import { useEffect, useState } from "react"

function ListScreen() {
    const [userData, setUserData] = useState(null)

    useEffect(() => {
        // 从localStorage读取数据
        const storedData = localStorage.getItem('userData')
        if(storedData) {
            setUserData(JSON.parse(storedData))
        }
    }, [])

    // 后续基于userData进行查询操作
    return (
        <div>
            {userData && <div>当前用户数据:{JSON.stringify(userData)}</div>}
        </div>
    )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:03:23