reactjs - 当用户未登录 React 时隐藏 app.js 中的组件
问题描述
我正在创建一个反应应用程序,我有一个登录页面,以及其他需要用户登录才能访问的页面。
在我的 app.js
我有一个用组件创建的完整结构。
render() {
return (
<BrowserRouter>
<Header showNavLeft={this.state.showNavLeft} onClickBars={(value) => this.setState({ showNavLeft: value })} />
<Container>
<NavLeft showNavLeft={this.state.showNavLeft} />
<Screen>
<Routes />
</Screen>
</Container>
<GlobalStyle />
</BrowserRouter>
);
}
}
我有以下路线文件
const PrivateRoute = ({ component: Component, ...rest }) => (
<Route
{...rest}
render={props =>
isAuthenticated() ? (
<Component {...props} />
) : (
<Redirect to={{ pathname: "/", state: { from: props.location } }} />
)
}
/>
);
const Routes = () => (
<Switch>
<Route path="/" exact component={Login} />
<PrivateRoute path="/home" component={home} />
<PrivateRoute path="/users" component={users}
</Switch>
)
当我访问登录页面时,我不希望加载我的所有 Header、NavLeft、Container 组件。
验证这一点的最佳方法是什么?
我被困在这种情况下,我想不出如何解决这个问题
解决方案
将其翻转以使Routes
层次结构更高,并且Header
和navLeft
组件是组件的独立部分Wrapper
。
const Wrapper = ({children} => (
<>
<Header showNavLeft={this.state.showNavLeft} onClickBars={(value) => this.setState({ showNavLeft: value })} />
<Container>
<NavLeft showNavLeft={this.state.showNavLeft} />
<Screen>
{children}
</Screen>
</Container>
<GlobalStyle />
</>
然后你想把 Wrapper 作为组件道具放在你的 Route 上,然后 home 组件应该是它的子组件,例如:
<Switch>
<Route exact path="/">
<Login/>
</Route>
<Route path="/home" component={Wrapper}>
<home/>
</Route>
<Route path="/user" component={Wrapper}>
<Users />
</Route>
</Switch>
或者:
<Switch>
<Route exact path="/">
<Login/>
</Route>
<Route path="/home" component={Wrapper}>
<Wrapper>
<home/>
</Wrapper>
</Route>
<Route path="/user">
<Wrapper>
<Users />
</Wrapper>
</Route>
</Switch>
如果您重构以摆脱单独的 PrivateRouter 也可能更容易,但将所有内容放在一个地方,然后重新调整内容以使标题和导航栏符合您的喜好,然后您可以看到要拆分的内容之后。
推荐阅读
- apache-spark - Spark-kafka:从 Spark 写入流时出现 org.apache.kafka.common.errors.TimeoutException
- angular - 限制刷新页面|浏览器限制| 角 6 |
- javascript - 函数内的变量范围
- c# - 在写入文件期间增加 ID(C#、CSV)
- angular - 为什么在 Angular 中使用 Gulp
- c# - SSIS 参考错误 Oracle DataAccess - 使用自定义类型参数调用 PL/SQL 过程
- c++ - std::list 可以用于简单的无锁队列吗?
- php - mysql中的WP序列化查询
- html - 如何在 uib-popover-html Angularjs 中的文本中添加单引号?
- java-8 - 按重复项列表分组