【问题标题】:Using if else in stateless functional component results in error when returning null在无状态功能组件中使用 if else 会导致返回 null 时出错
【发布时间】:2019-03-29 15:40:43
【问题描述】:

如果用户登录,我正在尝试有条件地返回导航栏。用户令牌保存到 localStorage,然后发送到后端系统。如果后端返回错误消息,则表示用户未登录,因此代码不应呈现导航栏。 但是,它并没有像我期望的那样工作,我现在真的需要其他人的知识。

我得到的错误信息是:

“Nav(...): 渲染没有返回任何内容。这通常意味着缺少返回语句。或者,不渲染任何内容,返回 null。”

Nav.js

import React from 'react';
import {Link} from 'react-router-dom';
import {tokenCheck} from '../utils/MediaAPI';

const Nav = () => {
  tokenCheck(localStorage.getItem('Login-token')).then(data => {
    if (data.message) {
      return null;
    } else {
      return (
          <nav>
            <ul>
              <li>
                <Link to="/home">Home</Link>
              </li>
              <li>
                <Link to="/profile">Profile</Link>
              </li>
              <li>
                <Link to="/logout">Logout</Link>
              </li>
            </ul>
          </nav>
      );
    }
  });
};

export default Nav;

从我的 App.js 父组件渲染。

  render() {
    return (
        <Router>
          <Nav/>
          <Route exact path="/" render={(props) => (
              <Login {...props} setUser={this.setUser}/>
          )}/>
          <Route exact path="/home" render={(props) => (
              <Home {...props} picArray={this.state.picArray}/>
          )}/>
          <Route exact path="/profile" render={(props) => (
              <Profile {...props} userData={this.state.user}/>
          )}/>
          <Route exact path="/single/:id" component={Single}/>
        </Router>
    );
  }

任何帮助将不胜感激!

【问题讨论】:

  • 您在承诺中回归。你必须await结果
  • @DTul 在Nav 中没有return,所以它返回undefined,而不是承诺。无论如何,不​​要忘记 async/await 函数也返回承诺。

标签: reactjs


【解决方案1】:

如果你根本不想渲染任何东西,你甚至不想处理&lt;Nav /&gt;。在其父级中,使用

tokenCheck(localStorage.getItem('Login-token')).then(data => {
    this.setState({errorMessage: data.message})
}

或者任何你想在你的州叫它的东西。将其放置在 componentDidMount 之类的地方并用于渲染

{!this.state.errorMessage && </Nav />}

这样,如果出现错误信息,你不想渲染的组件甚至永远不会弹出。

【讨论】:

  • 哦,太好了!处理这种情况的方法非常巧妙。非常感谢!
猜你喜欢
  • 2016-03-06
  • 2016-02-15
  • 2018-04-12
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2020-10-23
相关资源
最近更新 更多