javascript - React 中的渲染函数中的状态为空

标签 javascript reactjs

我有一个组件,我可以在其中进行 API 调用以获取与用户相关的数据。这是我的代码,

class Header extends React.Component {

  constructor(props) {
    super(props);
    this.state = { user: null };

  }

  componentDidMount() {

    getUserData(xobni_api).then((data) =>{
      this.setState({user : data});
      console.log(this.state.user);//A


    });
  }
  render() {
    return (
      <div className="header">
        <Masthead user={this.state.user.fullName} />//B
        <PrimaryNav/>

      </div>
    );
  }
}
export default Header;

A 行,我可以呈现用户的详细信息,而在 B 行,用户是 null,我得到一个错误。我错过了什么。我尝试在 componentDidMount()componentWillMount() 中调用 API。任何帮助表示赞赏。

最佳答案

您的组件第一次呈现 this.state.user 时是 null,对吗?这就是您在构造函数中设置的内容。因此 this.state.user.fullName 等同于 null.fullName 会崩溃。

您需要让您的初始状态代表您的 user 对象的形状,或者您需要在渲染组件之前进行空检查:

render() {
  return (
    <div className="header">
      {this.state.user && // <-- check if truthy
        <Masthead user={this.state.user.fullName} />
      }
      <PrimaryNav />
    </div>
  )
}

因为您正在执行 ajax 请求,所以您还可以利用这个机会显示加载指示器:

render() {
  return (
    <div className="header">
      {!this.state.user && // <-- if user is still null
        <div>Loading...</div>
      }

      {this.state.user && // <-- check if truthy
        <Masthead user={this.state.user.fullName} />
      }
      <PrimaryNav />
    </div>
  )
}

关于javascript - React 中的渲染函数中的状态为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40579715/

相关文章:

javascript - AngularJS:使用指令前置 HTML

javascript - JS AudioContext接口(interface): Am I doing this right?

javascript - 如何在浏览器上下载从 fetch 返回的 ReadableStream

javascript - 在没有 React.memo 的情况下使用 useCallback 有什么好处吗?

reactjs - AWS Amplify 用户 session 不会在 ReactJS 中过期

javascript - 从第三方小部件中删除类元素

正则表达式中的 JavaScript 不匹配某些内容

reactjs - 使用 Travis for React 如何不将警告视为错误

javascript - 模板文字中的多次评估...如何改进样式组件的填充计算?

javascript - react 无状态子组件不会更新父组件中的状态更改