如何使用反应路由器将数据从一个页面传递到另一个页面

Sha*_*net 1 javascript reactjs react-router-dom

请我需要关于 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>
    );
  }
}


Run Code Online (Sandbox Code Playgroud)

Dre*_*ese 5

选项 1:通过状态

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

<Link
  to={{
    pathname: '/home/userDetails',
    state: {
      infoId: info.id,
    },
  }}
>
Run Code Online (Sandbox Code Playgroud)

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

props.location && props.location.state && props.location.state.infoId

编辑 lucid-kowalevski-uxgs4

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

<Link to={`/home/userDetails/${info.id}`>
Run Code Online (Sandbox Code Playgroud)

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

<Route path="/home/userDetails/:infoId" component={... } />
Run Code Online (Sandbox Code Playgroud)

然后在组件中获取 id:

props.match.params.infoId
Run Code Online (Sandbox Code Playgroud)

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

位置 匹配链接


Soh*_*raf 0

您可以使用 的路径参数选项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>
  );
}
Run Code Online (Sandbox Code Playgroud)

传递参数:

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>;
  }
}
Run Code Online (Sandbox Code Playgroud)

访问组件中的路由器参数

import React from 'react'

export default function Topic(props) {
  return <h1>{props.match.params.name}</h1>
}
Run Code Online (Sandbox Code Playgroud)