[英]How to pass data between 2 classes in ReactJS
我對我認為是學校作業的反應鈎子有疑問。
在我的 app.js 中,我使用條件渲染來渲染 2 個不同的導航欄:1 個用於普通用戶,1 個用於管理員。 我無法理解如何從 login.js 更改呈現導航欄的 app.js 狀態。 下面是我的代碼。
登錄.js
handleLogon(){
try{
if(this.username == "user1" && this.password == "pass123"){
//send info to app.js
}
}
catch{
this.setState({
message: "Incorrect Credentials"
});
}
}
應用程序.js
//create state for loggedin
constructor(props) {
super(props);
this.state = {
isLoggedIn: false
}
}
handleLogonChange(b) {
if(b) {
this.setState({
isLoggedIn: true
});
}
}
App.js 渲染
render() {
if (this.state.isLoggedIn) {
return (
<div>
<nav className="navbar navbar-expand navbar-dark bg-dark">
<a href="/menus" className="navbar-brand">
Blue Devil Cafe Online
</a>
<div className="navbar-nav mr-auto">
<li className="nav-item">
<Link to={"/menus"} className="nav-link">
Menus
</Link>
</li>
<li className="nav-item">
<Link to={"/addmenu"} className="nav-link">
Add Menu
</Link>
</li>
<li className="nav-item">
<Link to={"/menuitems"} className="nav-link">
Menu Items
</Link>
</li>
<li className="nav-item">
<Link to={"/addmenuitem"} className="nav-link">
Add Menu Item
</Link>
</li>
</div>
</nav>
<div className="container mt-3">
<Switch>
<Route exact path={["/", "/menuitems"]} component={MenuItemList} />
<Route exact path="/addmenuitem" component={AddMenuItem} />
<Route path="/menuitems/:id" component={MenuItem} />
<Route exact path={"/menus"} component={MenuList} />
<Route exact path="/addmenu" component={AddMenu} />
<Route path="/menus/:id" component={Menu} />
</Switch>
</div>
</div>
)
}
else {
return (
<div>
<nav className="navbar navbar-expand navbar-dark bg-dark">
<a href="/menus" className="navbar-brand">
Blue Devil Cafe Online
</a>
<div className="navbar-nav mr-auto">
<li className="nav-item">
<Link to={"/home"} className="nav-link">
Home
</Link>
</li>
<li className="nav-item">
<Link to={"/calendar"} className="nav-link">
Calendar
</Link>
</li>
<li className="nav-item">
<Link to={"/cart"} className="nav-link">
Cart
</Link>
</li>
<li className="nav-item">
<Link to={"/login"} className="nav-link">
Login
</Link>
</li>
</div>
</nav>
<div className="container mt-3">
<Switch>
<Route exact path={"/home"} component={Home} />
<Route exact path={"/calendar"} component={Calendar} />
<Route exact path={"/cart"} component={Cart} />
<Route exact path={"/login"} component={Login} />
</Switch>
</div>
</div>
)
}
}
我想從登錄發送的是一個真正的布爾值到應用程序,以便它可以呈現更改條件以呈現管理員的導航欄而不是一般用戶的導航欄。 如果您還有什么需要,請告訴我們。
嘗試在 Route 上使用 render 方法而不是組件。 這樣,您可以將該函數作為道具引用傳遞給 Login 並從 child 獲取值以更新 parent。
這是代碼:
//create state for loggedin
constructor(props) {
super(props);
this.state = {
isLoggedIn: false
}
}
handleLogonChange(b)
{
if(b) {
this.setState({
isLoggedIn: true
});
}
}
render() {
if (this.state.isLoggedIn) {
return (
<div>
<nav className="navbar navbar-expand navbar-dark bg-dark">
<a href="/menus" className="navbar-brand">
Blue Devil Cafe Online
</a>
<div className="navbar-nav mr-auto">
<li className="nav-item">
<Link to={"/menus"} className="nav-link">
Menus
</Link>
</li>
<li className="nav-item">
<Link to={"/addmenu"} className="nav-link">
Add Menu
</Link>
</li>
<li className="nav-item">
<Link to={"/menuitems"} className="nav-link">
Menu Items
</Link>
</li>
<li className="nav-item">
<Link to={"/addmenuitem"} className="nav-link">
Add Menu Item
</Link>
</li>
</div>
</nav>
<div className="container mt-3">
<Switch>
<Route exact path={["/", "/menuitems"]} component={MenuItemList} />
<Route exact path="/addmenuitem" component={AddMenuItem} />
<Route path="/menuitems/:id" component={MenuItem} />
<Route exact path={"/menus"} component={MenuList} />
<Route exact path="/addmenu" component={AddMenu} />
<Route path="/menus/:id" component={Menu} />
</Switch>
</div>
</div>
)
}
else {
return (
<div>
<nav className="navbar navbar-expand navbar-dark bg-dark">
<a href="/menus" className="navbar-brand">
Blue Devil Cafe Online
</a>
<div className="navbar-nav mr-auto">
<li className="nav-item">
<Link to={"/home"} className="nav-link">
Home
</Link>
</li>
<li className="nav-item">
<Link to={"/calendar"} className="nav-link">
Calendar
</Link>
</li>
<li className="nav-item">
<Link to={"/cart"} className="nav-link">
Cart
</Link>
</li>
<li className="nav-item">
<Link to={"/login"} className="nav-link">
Login
</Link>
</li>
</div>
</nav>
<div className="container mt-3">
<Switch>
<Route exact path={"/home"} component={Home} />
<Route exact path={"/calendar"} component={Calendar} />
<Route exact path={"/cart"} component={Cart} />
<Route exact path={"/login"} render = {() => <Login handleLogonChange = {this.handleLogonChange}/>} />
</Switch>
</div>
</div>
)
}
}
此行已修改 => <Route exact path={"/login"} render = {() => <Login handleLogonChange = {this.handleLogonChange}/>} />
如何在登錄文件中使用:
登錄.js
props.handleLogon(){ // (or this.props.handleLogon) if class component
try{
if(this.username == "user1" && this.password == "pass123"){
//send info to app.js
return true
}
}
catch{
this.setState({
message: "Incorrect Credentials"
});
}
}
執行此操作的基本方法(您可能應該在繼續使用 Redux 或 Context API 之前嘗試了解)是傳遞props
。 如果您還不熟悉props
,您應該前往文檔以獲得完整的解釋。
當您在 JSX 中包含子組件時,只需將該數據值聲明為 prop,即可將數據從父組件傳遞給子組件。 通過將函數作為道具傳遞,然后可以更新父級中的狀態,您可以將數據從子級傳遞給父級。
在你的例子中,我們可以做這樣的事情。 我們需要在這里使用 render 方法將 props 傳遞給路由:
<Route exact path={"/login"} render={() => <Login handleLogonChange={this.handleLogonChange}/>} />
然后在Login
組件中,從 props 調用函數:
handleLogon(){
try{
if(this.username == "user1" && this.password == "pass123"){
this.props.handleLogonChange(true);
}
}
catch{
this.setState({
message: "Incorrect Credentials"
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.