【问题标题】:How to pass data between pages in React with react-router-dom v6?如何使用 react-router-dom v6 在 React 中的页面之间传递数据?
【发布时间】:2022-01-25 20:27:17
【问题描述】:

我正在尝试从主页打开一个新页面,单击列表上的项目会传递数据。我相信我的代码适用于旧版本的 react-router-dom。有人可以告诉我如何在较新版本的 React 中做同样的事情吗?我需要在新页面中显示 ID 和标题。

我试着按照这里的例子https://codesandbox.io/s/focused-wright-w8il9?file=/src/ViewUserDetails.js:354-377

错误提示 AppPage.js:15 Uncaught TypeError: Cannot read properties of null (reading 'DUMMY_DATA')

如果还有其他更正,请纠正我。我是新手。

谢谢。

GridList.js

import React from "react";
import ReactDOM from "react-dom";
import { Link, useNavigate } from "react-router-dom";
import { Component } from "react";
import GridItem from "./GridItem";
import AppPage from "./AppPage";
import classes from "./GridList.module.css";
import App01 from "./app-01.png";
import App02 from "./app-02.png";

const GridList = (props) => {


const DUMMY_DATA = [
{
  title: "tic tac toe",
  id: 1,
  image: App01,
},
{
  title: "snake",
  id: 2,
  image: App02,
},
];

return (
<div className={classes.gridc1}>
  {DUMMY_DATA.map((item) => {
    return (
      <div key={item.id}>
        <Link
          to={{
            pathname: `/apppage/${item.id}`,
            state: { DUMMY_DATA: item },

            
          }}
        >
          <GridItem key={item.id} image={item.image} />
        </Link>
      </div>
    );
  })}
</div>
);
};

export default GridList;

AppPage.js

import React from "react";
import {ReactDOM, render } from "react-dom";
import { useLocation } from "react-router-dom";
import { Component } from "react";

const AppPage = _ => {

 const { state }= useLocation();

return (
<div>
  <p>{state.DUMMY_DATA.id}</p>
  <p>{state.DUMMY_DATA.title}</p>
</div>
);
};

export default AppPage;

【问题讨论】:

  • 您的代码对我来说效果很好。我分叉了您的原始示例并输入了您的代码。 codesandbox.io/s/react-router-dynamic-link-forked-ddfw1?file=/…如果你修复了它,请告诉我。
  • 嘿,是的。它适用于 react-router-dom v5,但不适用于 v6。 (您可以查看 package.json 以获取更多详细信息)。因此,如果您能帮我解决 v6 的问题,那就太好了。我可以回到 v5,但这意味着我会相应地进行如此多的更改,这没有任何意义。所以任何其他解决方案都会受到赞赏。
  • 是的,我刚刚检查了 v6。我认为 react react-dom 和 react-router-dom 的版本只能在特定的组合中工作。尝试删除你的 node_modules 和 npm install @latest 这三个部门。
  • 是的。我会试试的。

标签: javascript reactjs routes


【解决方案1】:

我已经按照升级到 v6 react-router-dom 的文档解决了这个问题,它最终奏效了。这里是:https://reactrouter.com/docs/en/v6/getting-started/tutorial

解决方案很简单。我想我只是在寻找从 v5 升级到 v6 的更好的文档。

另外,如果对这里的任何人有帮助,我会附上代码。 (为了方便起见,我将一些诸如“DUMMY_DATA”之类的东西重命名为“项目”。无论如何,代码都会清楚地解释它)。如果还有任何疑问,请发表评论,我会尽力回复! :)

GridList.js

    import React from "react";
    import ReactDOM from "react-dom";
    import { Link, useParams } from "react-router-dom";
    import { Component } from "react";
    import GridItem from "./GridItem";
    import AppPage from "./AppPage";
    import classes from "./GridList.module.css";
    import { getItems } from "./Data";

    let items = getItems();

    const GridList = (props) => {
      return (
        <div className={classes.gridc1}>
          {items.map((item) => {
            return (
              <div key={item.id}>
                <Link to={`/apppage/${item.id}`} key={item.id}>
                  <GridItem key={item.id} image={item.image} />
                </Link>
              </div>
            );
          })}
        </div>
      );
    };

    export default GridList;

数据.js

    import React from "react";
    import ReactDOM, { render } from "react-dom";
    import App01 from "./app-01.png";
    import App02 from "./app-02.png";

    let items = [
    {
        title: "tic tac toe",
        id: 1,
        image: App01,
    },
    {
        title: "bytes",
        id: 2,
        image: App02,
    },
    ];

    export function getItems() {
    return items;
    }

    export function getItem(id) {
        return items.find((item) => item.id === id);
    }

AppPage.js

    import React from "react";
    import ReactDOM, { render } from "react-dom";
    import { useParams } from "react-router-dom";
    import { Component } from "react";
    import { getItem } from "./Data";

    const AppPage = _ => {

      let params = useParams();
      let item = getItem(parseInt(params.id, 10));

      return (
        <div>
          <p ptitle = {item.title} />
          <p pid = {item.id}> />
        </div>
      );
    };

    export default AppPage;

【讨论】:

    【解决方案2】:
    import React from "react";
    import ReactDOM, { render } from "react-dom";
    import Body from "../ui/Body";
    import Head from "../ui/Head";
    import Tail from "../ui/Tail";
    import { useLocation } from "react-router-dom";
    import { Component } from "react";
    
    const AppPage = () => {
      //don't forget to use this, good luck :)
      const { state } = useLocation();
      return (
        <div>
          // and use "state", don't use static
          // what is static ?
          <p>{state.DUMMY_DATA.id}</p>
          <p>{state.DUMMY_DATA.title}</p>
        </div>
        );
    };
    
    export default AppPage;
    

    【讨论】:

    • 嗨!对不起。是的,我的意思是一样的。我在帖子上打错了。我现在已经纠正了它,它仍然抛出错误。 Lmk 如果你能帮忙。谢谢。
    • 如果写下您的错误,我们可以更好地为您提供帮助。
    猜你喜欢
    • 2019-02-13
    • 2022-01-12
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2020-03-07
    • 2023-01-17
    • 1970-01-01
    相关资源
    最近更新 更多