javascript - React Router Link 显示两个组件
问题描述
我不知道描述这个问题的最佳方式,但我会尽力解释。
在我的核心 React App 组件中,我正在根据用户是否登录进行条件渲染。
如果登录 --- 我显示主页,如果没有,他们会看到登录屏幕。
在我的登录页面上,我试图在底部放置一个链接,引导用户注册一个新帐户。我的问题是,当我单击此“newuser”页面时,它会同时呈现我的登录表单和创建用户表单,它们都是不同的组件(见下文)。
我怀疑这是我如何设置反应路由器的问题,但我不确定问题是什么。
这是我的 App 组件中的代码。
<Container>
<Router>
<Notification />
{props.loggedUser ? (
<div>
<Navbar />
<Route exact path="/" render={() => <Blogs />} />
<Route exact path="/blogs" render={() => <Blogs />} />
<Route path="/login" render={() => <Login />} />
<Route
exact
path="/blogs/:id"
render={({ match }) => (
<Blog
blog={blogById(match.params.id)}
user={props.loggedUser}
/>
)}
/>
<Route exact path="/users" render={() => <Users />} />
<Route
exact
path="/users/:id"
render={({ match }) => <User user={userById(match.params.id)} />}
/>
</div>
) : (
<>
<Login />
</>
)}
</Router>
<div>
<br />
<em>Blog app, John 2019</em>
</div>
</Container>
这是我的登录组件。我已经尝试在上面的条件语句的两侧以及下面的登录表单中包含新用户页面的路由,就像我现在所做的那样。所有这些都导致相同的问题。
<h1>Login To Blog Application</h1>
<Form onSubmit={handleLogin}>
<Form.Field>
<label>username</label>
<input {...username.omitreset} name="username" />
</Form.Field>
<Form.Field>
<label>password</label>
<input {...password.omitreset} type="password" />
</Form.Field>
<Button type="submit">login</Button>
<div>
<br />
<Link to="/newuser">or signup to become a new user</Link>
<Route path="/newuser" render={() => <NewUser />} />
</div>
</Form>
</>
和 NewUser 组件
import React from "react";
import { connect } from "react-redux";
import { createUser } from "../reducers/userReducer";
import { setNotification } from "../reducers/notificationReducer";
import { Form, Button } from "semantic-ui-react";
const NewUser = props => {
const addUser = event => {
event.preventDefault();
const userObject = {
username: event.target.username.value,
name: event.target.name.value,
password: event.target.password.value
};
event.target.username.value = "";
event.target.name.value = "";
event.target.password.value = "";
props.createUser(userObject);
};
return (
<>
<h1>Create a New Blog Account</h1>
<Form onSubmit={addUser}>
<Form.Field>
<label>username</label>
<input {...props.username} name="username" />
</Form.Field>
<Form.Field>
<label>name</label>
<input {...props.name} type="password" />
</Form.Field>
<Form.Field>
<label>password</label>
<input {...props.password} type="password" />
</Form.Field>
<Button type="submit">login</Button>
</Form>
</>
);
};
const mapDispatchToProps = {
createUser,
setNotification
};
export default connect(null, mapDispatchToProps)(NewUser);
解决方案
您不应该进行条件渲染,因为当用户未登录时,Loggin 组件将被渲染并且根本不依赖于路径。然后通过单击 Link to="/newuser" 更改路径,然后在内部呈现注册
推荐阅读
- javascript - 如何应对快速行动
- javascript - 如何添加内容安全策略 (CSP)
- javascript - Node.js 中的多个 setTimeout 执行是单线程还是多线程?
- postgresql - 如何将从.bat文件中的复制命令返回的错误插入到表中
- spring-boot - 我们如何更改默认的 Spring Boot 登录页面
- nginx - 如何在 nginx 中将子域代理到主域以进行 SEO
- swagger - 为什么最近大幅减少了 swagger jbpm 文档?
- mongodb - 将备份从容器导出到主机
- python - 如何在不发生事件的情况下结束 SSEClient?
- php - mvc网站中的静态和非静态方法