reactjs - React如何加载组件onclick?
问题描述
我现在正在尝试构建一个类似于 reddit 的网络应用程序。我想在单击“登录/注册”下拉项时显示 LoginModal 组件,以便用户可以登录。我尝试了这个但没有任何反应。我为 LoginModal 组件使用了 reactstrap 库。单击项目时如何显示模态组件?
<DropdownItem onClick={() => <LoginModal/>}>Log In / Sign Up</DropdownItem>
这是我的代码
import React, { useState } from "react";
import "../../App.scss";
import {
Dropdown,
DropdownToggle,
DropdownMenu,
DropdownItem,
} from "reactstrap";
import { Link } from "react-router-dom";
import LoginModal from "./LoginModal";
import SignupModal from "./SignupModal";
const Navbar = () => {
const [dropdownOpen, setDropdownOpen] = useState(false);
const [token, setToken] = useState("");
const [username, setUsername] = useState("");
const updateToken = () => {
if (localStorage.getItem("userToken")) {
setToken(localStorage.getItem("userToken"));
setUsername(localStorage.getItem("username"));
}
};
const logOut = (e) => {
e.preventDefault();
localStorage.clear();
window.location.reload();
};
const toggle = () => setDropdownOpen((prevState) => !prevState);
let isLoggedIn = localStorage.getItem("userToken");
let user_name = localStorage.getItem("username");
return (
<nav className="nav-container">
<Link className="page-title" to="/">
<i className="fa fa-reddit" aria-hidden="true"></i>
<p className="nav-title">FakeReddit</p>
</Link>
<form className="search-bar-container">
<i className="fas fa-search"></i>
<input
className="search-bar"
name="search"
type="search"
placeholder="Search"
/>
</form>
<div className="button-container">
{isLoggedIn === null ? (
<>
<LoginModal updateToken={updateToken} />
<SignupModal updateToken={updateToken} />
</>
) : (
<div></div>
)}
<Dropdown size="sm" isOpen={dropdownOpen} toggle={toggle}>
<DropdownToggle className="dropdown-toggle">
{isLoggedIn === null ? (
<i className="fas fa-user"></i>
) : (
<>
<span>
<i className="fas fa-user"></i>
</span>
<span>
<p>{user_name}</p>
</span>
</>
)}
</DropdownToggle>
<DropdownMenu right>
<DropdownItem header>MORE STUFF</DropdownItem>
<DropdownItem>
<a
id="help-tag"
href="https://www.reddithelp.com/hc/en-us"
target="_blank"
rel="noopener noreferrer"
>
Help Center
</a>
</DropdownItem>
<DropdownItem divider />
{isLoggedIn === null ? (
<DropdownItem>Log In / Sign Up</DropdownItem>
) : (
<DropdownItem onClick={logOut}>
<Link to="/" className="logout-button">
Log Out
</Link>
</DropdownItem>
)}
</DropdownMenu>
</Dropdown>
</div>
</nav>
);
};
export default Navbar;
解决方案
您必须使用React Router设置路由以将不同的页面链接在一起。例如,您将有一个主页、一个登录页面和一个注册页面。当您单击不同的链接时,它们会呈现相应的路线。
推荐阅读
- fastify - Fastify 按标题获取项目总是返回原始 JSON 为 null
- c# - 在 DotPeek 的帮助下,我如何查看异步状态机(引擎盖下的异步/等待)?
- asp.net-core - 如何使用 ActionResult 发送抽象类型的集合
- java - 使用 OkHttp 请求时程序卡在 socketRead0 方法中
- kubernetes - Rook ceph 在 Kubernetes 上坏了?
- jquery - 更改表格中一行的位置
- c++ - qt 指向 qmap 的指针获取值
- java - 带有自定义字段绑定的 Jooq 批量插入
- node.js - 语法错误,不能在模块外使用 import 语句,即使在 package.json 中使用 "type":"module" 也会发生
- windows - 汇编中的变量到底是什么?