React.js setState不起作用。渲染问题

时间:2020-09-25 13:26:10

标签: reactjs authentication logging token setstate

登录后隐藏登录和注册问题

登录后,我setState检查:true,母鸡,通过单击注销按钮,我要设置状态检查:false-但不幸的是,它不起作用。

在尝试在Navigation.js中设置setState之前,但单击注销按钮后,“登录/注册”可能显示了0.01秒,但我仍然只能看到注销按钮 请帮忙,谢谢你!

这是我的代码

Navigation.js

import React, { Component } from "react";
import "./Navigation.css";
import { Nav, Navbar } from "react-bootstrap";
import axios from 'axios'
export default class Navigation extends Component {
  state = {

    button: []
  }



  render() {

    let buttons

    if (this.props.check) {
      buttons = (
        <Nav className="mr-auto">
          <Nav.Link href="\signin" onClick={() => {
            localStorage.removeItem('jwt')
            this.setState({
              check: false
            })
          }
          }>Logout</Nav.Link>

        </Nav>
      )
    }
    else if (!this.props.check) {
      buttons = (
        <Nav className="mr-auto">
          <Nav.Link href="\signin">Sign In</Nav.Link>
          <Nav.Link href="\register">Register</Nav.Link>
        </Nav>
      )
    }
    return (
      <Navbar
        className="NavbarContainer"
        collapseOnSelect
        expand="lg"
        bg="light"
        variant="light"
      >
        <Navbar.Brand href="\">
          LOGO
          {/* <Nav.Link href="\">LOGO</Nav.Link> */}
        </Navbar.Brand>
        <Navbar.Toggle aria-controls="responsive-navbar-nav" />
        <Navbar.Collapse id="responsive-navbar-nav">
          {/* <Nav className="mr-auto">
            <Nav.Link href="\signin">Sign In</Nav.Link>
            <Nav.Link href="\register">Register</Nav.Link>
          </Nav> */}
          {buttons}
        </Navbar.Collapse>
      </Navbar>
    );
  }
}

和App.js

import React, { Component } from "react";
import {
  BrowserRouter,
  BrowserRouter as Router,
  Route,
  Switch,
} from "react-router-dom";
import axios from "axios";

import Navigation from "./components/Navigation/Navigation";

export default class App extends Component {
  state = {
    user: [],
    check: false,
  };

  async componentDidMount() {

    axios.get("http://localhost:8002/users/me", {
      headers: {
        Authorization: `Bearer ` + localStorage.getItem("jwt"),
      },
    })
      .then((res) => {
        this.setState({
          user: res.data,
          check: true,
        })

        console.log(res.data);
      })
      .catch((err) => {
        console.log("error nie dziala" + err);
      });
  }

  render() {
    return (
      <div className="App">
        <BrowserRouter>
          <Navigation user={this.state.user, this.state.check} />
          <section className="mainContainer">
            <Router>
              <Switch>
                <Route exact path="/" component={Home}></Route>
                <Route path="/register" component={Register}></Route>
                <Route path="/signin_user" component={SignInAsUser}></Route>
                <Route
                  path="/signin_specialist"
                  component={SignInAsSpecialist}
                ></Route>

                <Route
                  path="/user_registration"
                  component={RegisterUser}
                ></Route>

                <Route
                  path="/specialist_registration"
                  component={RegisterSpecialist}
                ></Route>

                <Route
                  path="/search_for_specialist"
                  component={SearchForSpecialist}
                ></Route>
                <Route
                  path="/activespecialists"
                  component={ActiveSpecialists}
                ></Route>

                <Route
                  path="/specialist_account"
                  component={SpecialistAccount}
                ></Route>
                <Route path="/signin" component={SignIn}></Route>
                <Route
                  path="/user"
                  component={() => <UserAccount user={this.state.user} />}
                ></Route>
                <Route path="/specialist" component={SpecialistAccount}></Route>
                <Route
                  path="/activeSpecialist"
                  component={SpecialistAccount}
                ></Route>
                <Route component={NoMatch}></Route>
              </Switch>
            </Router>
          </section>
          <Footer />
        </BrowserRouter>
      </div>
    );
  }
}

1 个答案:

答案 0 :(得分:0)

它不起作用,因为您正在更新导航中的状态,该状态仅包含按钮数组,而不检查状态。 您应该从孩子那里更新您的父母身份。例如,可以通过将父setState函数传递给子级来实现此目的。 这里有一些类似的问题,例如,尝试在此处查找: How to update parent's state in React?

或者您可以实现一些全局状态。