通过反应路由器链接打字稿传递道具

时间:2021-02-21 22:16:16

标签: reactjs typescript react-router react-router-dom

我已经定义了我的路线并且我的链接工作正常。当路由器调用组件时,我想通过链接传递一个道具。我不知道这是否可能。

为了更好地理解,请检查代码: // I WANT TO PASS THE CURRENT PROJECT AS A PROP HERE//I WANT TO GET THE PASSED PROP IN THE LINK HERE

我在反应中的功能组件:

const ProjectList = () => {
....//not meaningful code. I get my data from a call to a database so its not passed in as an argument

return(
    <div className="project-list section">
      { projects && projects.map( project => {
        const path = '/project/' + project.id;
        return (
          <Link to={path} key={project.id}> // I WANT TO PASS THE CURRENT PROJECT AS A PROP HERE
            <ProjectSummary project={project} deleteCallback={projectDelete}/>
          </Link>
        )
      })}  
    </div>
  )
}

我的路线设置(省略导入):

function App() {
  return (
    <BrowserRouter>
      <div className="App">
        <NavBar />
        <Switch>
          <Route exact path='/' component={Dashboard}/>
          <Route
          path='/project/:id'
          render={(props) => (
            <ProjectDetails {...props}/> //I WANT TO GET THE PASSED PROP IN THE LINK HERE
          )}
          />
          <Route path='/signin' component={SignIn}/>
          <Route path='/signup' component={SignUp}/>
          <Route path='/create' component={CreateProject}/>
        </Switch>
      </div>
    </BrowserRouter>
  );
}

export default App;

这是从功能组件中获取属性,当用户单击由路由器调用的链接时调用。这是我在 Router 调用时传入 prop 的地方。

不是很相关,但是要从上面的代码中检查相应 Route 子组件的名称,它会是:

const ProjectDetails = (project: IFirebaseProject) => {
    //....not meaningfull code
}

我检查了近似值:

<Link to="ideas" params={{ testvalue: "hello" }}>Create Idea</Link>

或:

<Link to={{
  pathname: '/tylermcginnis',
  state: {
    fromNotifications: true
  }
}}>Tyler McGinnis</Link>

这最后一个与我想做的非常相似,这是传递一个状态或一个具有属性的对象,但是我无法使其工作。

其他尝试来自 here

来自 package.json 的相关版本信息:

"typescript": "^4.1.3",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-redux": "^7.2.2",
"react-router-dom": "^5.2.0",

2 个答案:

答案 0 :(得分:1)

你的最后一个想法应该根据反应路由器文档传递状态,也许你在组件道具中寻找道具,但链接状态值将在路由器位置对象中,location = useLocation()https://reactrouter.com/web/api/location

答案 1 :(得分:1)

如果我正确理解您的问题,您希望将额外的路由状态传递给呈现组件的 Route,但您不想重新处理正在呈现的组件以从路由道具中读取任何内容。

您可以“sip”传递的路由状态作为组件消耗的命名道具注入/传递。

<Link
  to={{
    pathname: path,
    state: {
      project,
    },
  }}
  key={project.id}
>
  <ProjectSummary project={project} deleteCallback={projectDelete}/>
</Link>

将传递的路由状态值分解为特定的命名道具。

<Route
  path='/project/:id'
  render={({ location }) => {
    const { state } = location;
    return <ProjectDetails project={state.project} /> 
  }}
/>