gpt4 book ai didi

javascript - 将 this.state 带到外部范围

转载 作者:行者123 更新时间:2023-12-03 01:47:17 24 4
gpt4 key购买 nike

这是我的 App.js

import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';
import {BrowserRouter as Router} from 'react-router-dom';
import Navbar from "./components/nav";
import firebase from './firebase';
import Questions from './components/questions';
import Stuff from './components/stuff';
class App extends Component {
constructor(p) {
super(p);
this.state = {user: null}
}

render() {
return (
<div className="App">
<Navbar/>
{this.state.user ? <Questions/> : <Stuff/>}
</div>
);
}
}

export default App;

这个想法是,它应该呈现导航栏,如果用户登录,它应该呈现问题元素,否则,呈现其他内容。

这是我的 <Navbar/>元素:

import React from 'react';
import {Navbar as Bar, Nav, NavItem, Modal, Button, FormControl} from 'react-bootstrap';
import {BrowserRouter as Router, Link, Route} from 'react-router-dom';
import firebase, {auth} from '../firebase';

class Navbar extends React.Component {
constructor(props) {
super(props);
this.state = {};
this.login = this.login.bind(this);
this.logout = this.logout.bind(this);
this.openLogin = this.openLogin.bind(this);
this.handleClose = this.handleClose.bind(this);
}

componentDidMount() {
auth.onAuthStateChanged((user) => {
if (user) {
this.setState({user});
}
});
}

logout() {
auth.signOut()
.then(() => {
this.setState({
user: null
});
});
}

login() {
var email = document.getElementById('email').value;
var password = document.getElementById('password').value;
auth.signInWithEmailAndPassword(email, password)
.then(result => {
const user = result.user;
this.setState({user});
document.getElementById('close').click();
}
).catch(e => console.log(e));
}

openLogin() {
this.setState({show: true});
}

handleClose() {
this.setState({show: false});
}

render() {
return (
<React.Fragment>
<Router>
<Bar>
<Bar.Header>
<Bar.Brand>
<a href="/home">UczIchApp</a>
{/*<Route path='path' component=""/>*/}
</Bar.Brand>
<Bar.Brand>

</Bar.Brand>
</Bar.Header>
<Nav>
{
this.state.user ?
<NavItem onClick={this.logout}>Wyloguj się</NavItem>
:
<NavItem onClick={this.openLogin}>Zaloguj się</NavItem>
}
</Nav>
</Bar>
</Router>
<Modal show={this.state.show} onHide={this.handleClose}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>
<form>
<FormControl
id="email"
type="email"
label="Email address"
placeholder="Enter email"
/>
<FormControl id="password" label="Password" type="password"/>
<Button onClick={this.login}>Zaloguj</Button>
</form>
</Modal.Body>
<Modal.Footer>
<Button id="close" onClick={this.handleClose}>Close</Button>
</Modal.Footer>
</Modal>
</React.Fragment>
)
}
}

export default Navbar;

所以我想改变 <App/> 的内饰元素,基于 <Navbar/> 中更改的用户状态元素。我怎样才能做到这一点?目前该状态在 <App.js/> 中不可用。

最佳答案

在您的应用组件中创建一个函数 checkUserState

 constructor(p) {
super(p);
this.state = {user: null}
this.checkUserState= this.checkUserState.bind(this);
}

checkUserState(user){
this.seState({user});
}

然后将 Navbar 组件中的 props 传递为

 <Navbar {...this}/>

在您设置状态的导航栏组件内,执行此操作

this.setState({
user: null
},function(){
this.props.checkUserState(this.state.user)
});

因为您需要反向操作,因为 Navbar 是子组件。

关于javascript - 将 this.state 带到外部范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50582385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com