【问题标题】:How to pass data from a page to another page using react router如何使用反应路由器将数据从一个页面传递到另一个页面
【发布时间】:2022-01-01 06:20:32
【问题描述】:

请问我需要有关 react-router-dom 的帮助,我是图书馆的新手,并且似乎可以找到任何解决方案。我从一个 api 调用中得到三个结果,其中我映射数据以在 UI 上呈现它,现在我需要的是,如果我单击此列表之一上的一行,我希望它带我到屏幕只显示我点击的那件事的详细信息。

import React, { Component } from "react";

export default class User extends Component {
  state = { userDetails: "" };

  componentDidMount() {
    axios.get(`https://urlforapi.com`)
    .then(({ data }) => {
      this.setState({
        userDetails: data
      });
    });
  }

  render() {
    const { userDetails } = this.state;
    return (
      <div>
        {userDetails
          ? userDetails.map(info => {
              return (
                <Link to="/home/userDetails">
                  <div key={info.id}>
                    <p>{info.name}</p>
                  </div>
                  <div>
                    <p>{info.age}</p>
                  </div>
                  <div>
                    <p>{info.description}</p>
                  </div>
                </Link>
              );
            })
          : null}
      </div>
    );
  }
}


【问题讨论】:

标签: javascript reactjs react-router-dom


【解决方案1】:

选项 1:通过路线状态

发送路由转换中的状态。

  • 使用react-router-dom v5

您可以传递映射条目独有的一些状态,例如info.id,以及单击链接时发生的路由推送。这会混淆来自用户的数据,因为您不会将信息泄露到 ui(即浏览器)。

<Link
  to={{
    pathname: '/home/userDetails',
    state: {
      infoId: info.id,
    },
  }}
>
  • 使用react-router-dom v6

链接 API 在 v6 中有所改变,state 现在是一个道具。

<Link
  to='/home/userDetails'
  state={
    infoId: info.id,
  }
>

然后,您可以从该路由返回的组件上的 location prop/object 解压状态。如果用户从其他地方导航到 '/home/userDetails',请使用警卫,因为 state 可能未定义。

如果通过了路由道具:

props.location &amp;&amp; props.location.state &amp;&amp; props.location.state.infoId

props.location?.state?.infoId

如果使用函数组件,那么你也可以使用useLocation React 钩子:

const { state: { infoId } = {} } = useLocation();

选项 2:在 URL 中传递一些东西

<Link to={`/home/userDetails/${info.id}`>

并从返回的路由组件中的match 属性中检索参数。例如,如果路线如下所示:

<Route path="/home/userDetails/:infoId" component={... } />

然后在组件中获取id:

props.match.params.infoId

对于函数组件,useParams React 钩子:

const { infoId } = useParams();

用户可以看到这一点,但您不必使用保护模式来访问,因为根据定义,它将由路由定义(尽管如果用户输入无效的 id,仍然可以定义 infoID )。

【讨论】:

  • 我似乎不明白第一个选项,您能否在第二页上显示一些有关如何获取此数据的代码。我试过了,当我记录我的数据时它一直返回“未定义”。
  • 我以为我做到了。我从react-router-dom 文档中复制/粘贴了它,并根据您的代码对其进行了定制,并包含了该部分的链接。我已经更新了我的答案以包含一个正在运行的代码框的链接。如果您在尝试访问我提到的 location.state 时看到“未定义”,请使用保护模式来确保将对象属性路径定义为您需要的状态值。
【解决方案2】:

如果您在反应应用程序中使用功能组件。您可以按照以下步骤进行

主页:

<Link
  to={{
    pathname: '/your/path',
    state: { 
       data: "your data"
    },
  }}
>

在您要路由的子页面或页面中:

使用 useLocation(版本 5.+)挂钩

const emp = useLocation()

console.log(emp)

输出

{ 
   state: { 
       data: "your data" 
   } 
}

【讨论】:

    【解决方案3】:

    这是您可以将数据传递给导航组件的方式

    <Link
      to={{
        pathname: '/home/userDetails',
        state: {infoId: info.id},
      }}
    >
    

    在导航组件中像这样访问

    如果它是基于类的组件。

    this.props.location.state
    

    如果是功能组件

    props.location.state
    

    【讨论】:

      【解决方案4】:

      您可以使用react-router-dom 的路径参数选项。

      示例

      import React from 'react'
      import { BrowserRouter as Router, Route } from 'react-router-dom'
      
      import Topic from '../topic'
      
      export default function App() {
        return (
          <Router>
            <div>
              <Route path="/topic/:name" component={Topic} />
            </div>
          </Router>
        );
      }
      

      传递参数:

      import React, { Component } from "react";
      import { Link } from 'react-router-dom'
      
      export default class Topics extends Component {
        render() {
          return <Link to="/topic/someTopicName">Some Topic</Link>;
        }
      }
      

      在组件中访问路由器参数

      import React from 'react'
      
      export default function Topic(props) {
        return <h1>{props.match.params.name}</h1>
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        • 2020-11-20
        • 2018-04-10
        • 2015-09-12
        • 1970-01-01
        • 2012-01-03
        相关资源
        最近更新 更多