reactjs 如何在react-router-dom v6中路由组件中添加props

gab6jxml  于 2023-05-22  发布在  React
关注(0)|答案(5)|浏览(203)

正如标题所述,我曾经有一个带有状态组件的页面,该组件根据对url的更改获得不同的profiles。
现在,升级到React路由器v6,我真的不明白如何使它再次工作.我知道现在解决这个问题的唯一方法是使用诸如useNavigate之类的钩子,但我不知道如何在我的代码中实现这一点。我已经阅读了react-router v6文档,仍然不明白如何解决我的问题。
下面的代码。代码从子组件排序,直到index. tsx。组件是广泛的,基本上是一个statfulcomponent,它从props中获取其状态。并根据给定的 prop ,它将相应地显示其内容。
有人能为我的设置建议一个解决方案吗?

*CalculatorPage.tsx

import Calculator from "../components/Calculator";
import { Route, Routes } from "react-router";
import { Link } from "react-router-dom";

import { FlowrateCalc } from "../calc/calculators/FlowrateCalc";
import { ValveKvsCalc } from "../calc/calculators/ValveKvsCalc";
import { AccelerationCalc } from "../calc/calculators/AccelerationCalc";

export default function CalculatorPage() {
  return (
    <div>
      {/* when changing links, there is no props being sent to Calculator. Calculator is a STATEFUL component*/}
      <Routes>
        <Route
          path={"flow"}
          element={<Calculator {...FlowrateCalc} />}
        />
        <Route
          path={"kvs"}
          element={<Calculator {...ValveKvsCalc} />}
        />
        <Route
          path={"acceleration"}
          element={<Calculator {...AccelerationCalc} />}
        />
      </Routes>
      
      <Link to={"flow"}>
        <button style={{ color: "green" }}>flow</button>
      </Link>
      <Link to={"kvs"}>
        <button style={{ color: "red" }}>kvs</button>
      </Link>
      <Link to={"acceleration"}>
        <button style={{ color: "blue" }}>acceleration</button>
      </Link>
    </div>
  );
}

Main.tsx

import { Route , Routes} from "react-router-dom";
import HomePage from "../pages/HomePage";
import CalculatorPage from "../pages/CalculatorPage";
import AboutPage from "../pages/AboutPage";

export default function Main() {
  return (
    <div>
      <Routes>
        <Route path="/" element={<HomePage/>} />
        <Route path="/calculator/*" element={<CalculatorPage/>} />
        <Route path="/about" element={<AboutPage/>} />
      </Routes>

    </div>
  );
}

App.tsx

import { BrowserRouter } from "react-router-dom";

import Header from "./layout/Header";
import Footer from "./layout/Footer";
import Main from "./layout/Main";

export default function App() {
  return (
    <div>
      <BrowserRouter>
        <Header />
        <Main />
        <Footer />
      </BrowserRouter>
    </div>
  );
}

Index.tsx

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { Provider } from "react-redux";
import { store } from './state';
import reportWebVitals from './reportWebVitals';

ReactDOM.render(
  <React.StrictMode>
    <Provider store={store}>
    <App />
    </Provider>
  </React.StrictMode>,
  document.getElementById('root')
);

reportWebVitals();
iyfamqjs

iyfamqjs1#

除非有人有另一个答案,否则似乎没有这样的解决办法。从react router v6开始,没有通过router传递 prop 。相反,我们必须使用功能组件和React路由器钩子来检测url的变化。

guicsvcw

guicsvcw2#

你绝对可以把 prop 传递给路由器的组件...
检查一下:

<Router>
  <Routes>
    <Route path='/page' element={<Page props={'helloWorld from Props'}/>}/>
  </Routes>
</Router>

然后在Page.js中:

function Page(props){

console.log(props)

return(
    <div>
    </div>

它看起来像以前一样工作。* 耸耸肩 *

dly7yett

dly7yett3#

您可以使用react-router-dom提供的钩子从URL中提取参数数据。

import { useParams } from "react-router-dom";

const params = useParams(); // inside your component

这允许您从URL中提取数据
这个官方文档链接也可能对你有帮助

zu0ti5jz

zu0ti5jz4#

您可以创建一个商店,如果需要,useSelector钩子可以在那个时候帮助您。
通过使用useSelector,您可以轻松地获得商店的状态。
用途:

import React from 'react'
import { useSelector } from 'react-redux'

export const CounterComponent = () => {
  const counter = useSelector((state) => state.counter)
  return <div>{counter}</div>
}
i34xakig

i34xakig5#

不幸的是,在react router dom的v6中,我们不能使用像path这样的属性。如果你想使用参数,你可以使用钩子:导入useParams
const { id } = useParams();

相关问题