如何在同一页面上的 2 个组件之间切换?
How to switch between 2 components on the same page?
我正在尝试在 React Js 中创建一个登录和注册页面,想法是它们应该呈现在同一页面上,并且用户应该能够在它们之间切换(像这样 example)
我可以在组件之间创建切换功能(使用 useState),但问题是我还需要 url 根据用户的选择进行更改(如果用户想要登录,url应该是“/login”,如果 sign-up => “/signup”)。我使用 React Router 为登录和注册创建了单独的组件,但它们在不同的页面上打开,我希望实现的是将它们都放在同一个登录页面上。
import React from "react";
import "./styles.css";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Login from "./Login";
import SignUp from "./SignUp";
export default function App() {
return (
<div className="App">
<Router>
<Switch>
<Route exact path="/">
<Login />
</Route>
<Route exact path="/sign-up" component={SignUp} />
</Switch>
</Router>
</div>
);
}
import React from "react";
import { Link } from "react-router-dom";
export default function Login() {
return (
<div style={{ display: "flex", flexDirection: "column" }}>
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<Link to="/">
<h1>Login</h1>
</Link>
<Link to="/sign-up">
<h1>Sign Up</h1>
</Link>
</div>
<form
style={{ display: "flex", flexDirection: "column", padding: "40px" }}
>
<input type="email" placeholder="email"></input>
<input type="password" placeholder="password"></input>
</form>
</div>
);
}
import React from "react";
export default function SignUp() {
return (
<div>
<form style={{display:"flex", flexDirection:"column", padding:"40px"}}>
<input type ="name" placeholder="Name"></input>
<input type ="email" placeholder="email"></input>
<input type ="password" placeholder="password"></input>
</form>
</div>
);
}
我对 React Js 还很陌生,所以我不知道这是否可行。我将不胜感激任何建议和帮助,谢谢。
首先,不要在登录组件中包含 'Login' 和 'Sign Up' 链接。将它们移至您的 App.js.
App.js
<div className="App">
<Router>
<Switch>
<Route path="/">
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<Link to="/login">
<h1>Login</h1>
</Link>
<Link to="/sign-up">
<h1>Sign Up</h1>
</Link>
</div>
<Route exact path="/sign-up" component={SignUp} />
<Route exact path="/Login" component={Login} />
</Route>
</Switch>
</Router>
</div>
请注意,必须删除 <Route exact path='/'>
中的 exact
,以便您可以在路由更改时切换并呈现登录或注册页面。您可以随时参考 react-router tutorial.
对于登录组件,只需包含表单(就像您为注册组件所做的那样)就足够了。
已更新code sandbox
从 <App />
组件中删除 <Login />
标签并将其添加到 component
属性中,就像添加注册一样。您可以在“/”路径中查看登录页面。
然后从登录组件中删除 <Link to="/">
标签,只保留 <Link to="/sign-up" >
。然后,当您在登录页面中点击 link 时,您将被路由到注册组件。
但是,要实现这一点,您需要“react-router”中的“历史记录”。从“react”导入“useHistory”并将 history = useHistory()
放入您的登录组件(以及内部注册组件以及路由返回)并添加 <Link to="sign-up" onClick = {() => history.push('/sign-up')}
.
单独创建一个Header组件,并在两个地方(登录和注册)组件中导入它。
示例
Header.js
export default function Header() {
return (
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<Link to="/">
<h1>Login</h1>
</Link>
<Link to="/sign-up">
<h1>Sign Up</h1>
</Link>
</div>
)
}
现在在登录和注册组件中导入它
Login.js
<div style={{ display: "flex", flexDirection: "column" }}>
<Header />
<form
style={{ display: "flex", flexDirection: "column", padding: "40px" }}
>
<input type="email" placeholder="email"></input>
<input type="password" placeholder="password"></input>
</form>
</div>
SignUp.js
<div>
<Header />
<form
style={{ display: "flex", flexDirection: "column", padding: "40px" }}
>
<input type="name" placeholder="Name"></input>
<input type="email" placeholder="email"></input>
<input type="password" placeholder="password"></input>
</form>
</div>
我正在尝试在 React Js 中创建一个登录和注册页面,想法是它们应该呈现在同一页面上,并且用户应该能够在它们之间切换(像这样 example)
我可以在组件之间创建切换功能(使用 useState),但问题是我还需要 url 根据用户的选择进行更改(如果用户想要登录,url应该是“/login”,如果 sign-up => “/signup”)。我使用 React Router 为登录和注册创建了单独的组件,但它们在不同的页面上打开,我希望实现的是将它们都放在同一个登录页面上。
import React from "react";
import "./styles.css";
import { BrowserRouter as Router, Switch, Route } from "react-router-dom";
import Login from "./Login";
import SignUp from "./SignUp";
export default function App() {
return (
<div className="App">
<Router>
<Switch>
<Route exact path="/">
<Login />
</Route>
<Route exact path="/sign-up" component={SignUp} />
</Switch>
</Router>
</div>
);
}
import React from "react";
import { Link } from "react-router-dom";
export default function Login() {
return (
<div style={{ display: "flex", flexDirection: "column" }}>
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<Link to="/">
<h1>Login</h1>
</Link>
<Link to="/sign-up">
<h1>Sign Up</h1>
</Link>
</div>
<form
style={{ display: "flex", flexDirection: "column", padding: "40px" }}
>
<input type="email" placeholder="email"></input>
<input type="password" placeholder="password"></input>
</form>
</div>
);
}
import React from "react";
export default function SignUp() {
return (
<div>
<form style={{display:"flex", flexDirection:"column", padding:"40px"}}>
<input type ="name" placeholder="Name"></input>
<input type ="email" placeholder="email"></input>
<input type ="password" placeholder="password"></input>
</form>
</div>
);
}
我对 React Js 还很陌生,所以我不知道这是否可行。我将不胜感激任何建议和帮助,谢谢。
首先,不要在登录组件中包含 'Login' 和 'Sign Up' 链接。将它们移至您的 App.js.
App.js
<div className="App">
<Router>
<Switch>
<Route path="/">
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<Link to="/login">
<h1>Login</h1>
</Link>
<Link to="/sign-up">
<h1>Sign Up</h1>
</Link>
</div>
<Route exact path="/sign-up" component={SignUp} />
<Route exact path="/Login" component={Login} />
</Route>
</Switch>
</Router>
</div>
请注意,必须删除 <Route exact path='/'>
中的 exact
,以便您可以在路由更改时切换并呈现登录或注册页面。您可以随时参考 react-router tutorial.
对于登录组件,只需包含表单(就像您为注册组件所做的那样)就足够了。
已更新code sandbox
从 <App />
组件中删除 <Login />
标签并将其添加到 component
属性中,就像添加注册一样。您可以在“/”路径中查看登录页面。
然后从登录组件中删除 <Link to="/">
标签,只保留 <Link to="/sign-up" >
。然后,当您在登录页面中点击 link 时,您将被路由到注册组件。
但是,要实现这一点,您需要“react-router”中的“历史记录”。从“react”导入“useHistory”并将 history = useHistory()
放入您的登录组件(以及内部注册组件以及路由返回)并添加 <Link to="sign-up" onClick = {() => history.push('/sign-up')}
.
单独创建一个Header组件,并在两个地方(登录和注册)组件中导入它。
示例
Header.js
export default function Header() {
return (
<div style={{ display: "flex", justifyContent: "space-evenly" }}>
<Link to="/">
<h1>Login</h1>
</Link>
<Link to="/sign-up">
<h1>Sign Up</h1>
</Link>
</div>
)
}
现在在登录和注册组件中导入它
Login.js
<div style={{ display: "flex", flexDirection: "column" }}>
<Header />
<form
style={{ display: "flex", flexDirection: "column", padding: "40px" }}
>
<input type="email" placeholder="email"></input>
<input type="password" placeholder="password"></input>
</form>
</div>
SignUp.js
<div>
<Header />
<form
style={{ display: "flex", flexDirection: "column", padding: "40px" }}
>
<input type="name" placeholder="Name"></input>
<input type="email" placeholder="email"></input>
<input type="password" placeholder="password"></input>
</form>
</div>