我在 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/