在受保护的路线中传递道具

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在受保护的路线中传递道具相关的知识,希望对你有一定的参考价值。

我在reactjs应用程序中使用受保护的路由,我想知道如何在受保护的路由中传递道具,或者是否有更优雅的方法来解决我的问题。

我觉得需要在受保护的路由中传递道具的原因是注销按钮位于受保护的组件中,我需要与父组件通信,其中包含用户尝试注销的所有路由。

这是相关代码:

父组件:

render() {
    const PrivateRoute = ({ component: Component, ...rest }) => (
        <Route {...rest} render={(props) => (
            isAuthenticated === true
            ? <Component {...props} /*I tried inserting handleLogout={this.handleLogout} here */ />
            : <Redirect to="/Login"/>
        )} />
    )

return (
<HashRouter basename={BASE_URL}>
    <div className="stories-module">
    <PrivateRoute
        exact
        path={'/login'}
        component={Login}
      />
    <PrivateRoute
        exact
        path={'/Main/'}
        component={Main}
    />
</HashRouter>
)};

不幸的是,我不知道如何解决这个问题。

在路径组件中传递道具被认为是不好的做法吗?如果是这样,我怎么办?如果没有,我该怎样正确地通过道具呢?

答案

在课堂外声明你的PrivateRoute

const PrivateRoute = ({ component: Component, handleLogout, isAuthenticated, ...rest }) => (
        <Route {...rest} render={(props) => (
            isAuthenticated === true
            ? <Component {...props} handleLogout={handleLogout} />
            : <Redirect to="/Login"/>
        )} />
);

然后将handleLogout传递给你的PrivateRoute道具:

render() {
    return (
        <HashRouter basename={BASE_URL}>
            <div className="stories-module">
                <Route
                     exact
                     path={'/login'}
                     component={Login}
                />
                <PrivateRoute
                     exact
                     path={'/Main/'}
                     component={Main}
                     handleLogout={this.handleLogout}
                     isAuthenticated={isAuthenticated}
                />
            </div>
        </HashRouter>
    )
};

你可能想要声明你PrivateRoute如下所示,以通过传播所有道具将任何道具传递给组件:

const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => (
        <Route {...rest} render={(props) => (
            isAuthenticated === true
            ? <Component {...props} {...rest} />
            : <Redirect to="/Login"/>
        )} />
);
另一答案

为你的PrivateRoute HOC添加一个额外的道具

render() {
  const PrivateRoute = ({ component: Component, handleLogout, ...rest }) => (
    <Route {...rest} render={(props) => (
        isAuthenticated === true
        ? <Component handleLogout={handleLogout} {...props} />
        : <Redirect to="/Login"/>
    )} />
  );

  return (
    <HashRouter basename={BASE_URL}>
      <PrivateRoute
        exact
        path={'/login'}
        component={Login}
        handleLogout={this.handleLogout}
      />
      <PrivateRoute
        exact
        path={'/Main/'}
        component={Main}
        handleLogout={this.handleLogout}
      />
    </HashRouter>
  );
}

以上是关于在受保护的路线中传递道具的主要内容,如果未能解决你的问题,请参考以下文章

使用路线渲染Google地图,如何传递路线道具?

如何在不复制片段的情况下传递道具

页面未呈现;在 react-router-dom 中使用受保护的路由将道具传递给孩子时

如何通过链接传递道具

如何在受保护的 Word 文档中使用 Word RepeatingSection ContentControl

公共密码无法在受保护的工作表中识别