javascript - 子组件无法从父组件获取状态

标签 javascript reactjs react-native

我在 App.js 中有以下代码;

constructor() {
    super();
    this.state = {
        isLoggedIn: false,
        username: "",
    }
}

componentDidMount() {
    let isLoggedIn = false;
    let username = "";

    if (localStorage.getItem("token")) {
        fetch("https://localhost:8000/user", {
            method: "POST",
            headers: {
                "Authorization": `Bearer ${localStorage.getItem("token")}`
            }
        }).then(response => response.json()).then(response => {
            if (response.success) {
                isLoggedIn = true;
                username = response.username;
            } else {
                isLoggedIn = false;
                username = "";
                localStorage.removeItem("token");
            }

            this.setState({
                isLoggedIn : isLoggedIn,
                username: username
            })
        })
    }
}

render() {

    return (
       <Navbar username={this.state.username}/>
    )
}

通过控制台记录输出,一旦调用 componentDidMount,状态中的用户名就会按应有的方式分配。在 Navbar.js 中;

constructor(props) {
    super(props);
    this.state = {
        navComponents: []
    }
}

componentDidMount()  {
    console.log(this.props.username);
    let navComponents = [];
    if (this.props.username === "") { //Not Signed In.
        navComponents.push(
            <ul className="Navbar-list">
                <li className="Navbar-item">
                    <Link to="/register" className="Navbar-link">Sign Up</Link>
                </li>
                <li className="Navbar-item">
                    <Link to="/login" className="Navbar-link">Log In</Link>
                </li>
            </ul>
        );
    } else {
        navComponents.push(
            <p>Hello, {this.props.username}</p>
        )
        navComponents.push(
            <ul className="Navbar-item">
                <Link to="/signout" className="Navbar-link">Sign Out</Link>
            </ul>
        )
    }
    this.setState({
        navComponents : navComponents
    })
}

我相信它应该从应用程序获取用户名。但是,用户名始终是一个空字符串(应用程序的初始状态)。我不确定为什么在应用程序中安装组件后导航栏不更新。

最佳答案

你做错了,你的渲染函数不是应该为组件做标记吗? 尝试这样应该可以正常工作。

constructor(props) {
    super(props);
}



render(){
    return (
            {this.props.username ? 
             <> 
              <p>Hello, {this.props.username}</p>
              <ul className="Navbar-item">
                <Link to="/signout" className="Navbar-link">Sign Out</Link>
             </ul>
             </>
             : 
            <ul className="Navbar-list">
                <li className="Navbar-item">
                    <Link to="/register" className="Navbar-link">Sign Up</Link>
                </li>
                <li className="Navbar-item">
                    <Link to="/login" className="Navbar-link">Log In</Link>
                </li>
            </ul>})
}

关于javascript - 子组件无法从父组件获取状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59801489/

相关文章:

javascript - 如何捕获 "file selected"事件?

javascript - 我可以在 Redux 中从一个 reducer 获得多个状态吗?

react-native - 拖动时React Native "interactive"keyboardDismissMode引发错误

javascript - this.setState 无法正常工作;子 Prop 继承了错误的信息 - React-Native

javascript - 使用 reanimated、redash 来 react 原生动画 onScroll 的问题

javascript - 如何在完整日历中使用新加载的事件覆盖或删除以前的事件

javascript - JS 运算符性能

reactjs - React Query - 无法通过 'getQueryData' 访问数据,总是返回 undefined

javascript - react native 按钮样式不起作用

javascript - this.setState 是否在 react 中返回 promise