javascript - React Hooks - 根据状态有条件地渲染组件

标签 javascript reactjs react-hooks

我正在尝试创建一个基本的 react带钩子(Hook)的功能组件。

import React, { useState, useEffect } from 'react';
import Header from 'test-header';
import Dashboard from 'test-dashboard';
import { api } from '../api';

function storeUser(user) {
  if (user) {
    localStorage.user = JSON.stringify(user);
  } else {
    delete localStorage.user;
  }
}

async function login() {
  const [error, setError] = useState([]);
  const [user, setUser] = useState([]);

  try {
    const user = await api({
      endpoint: 'identity/login',
      method: 'POST',
      json: {
        email: 'test@abc.com',
        password: '12345'
      }
    });
    setUser(user);
    storeUser(user);
  } catch (err) {
    setError(err);
  }
}

function Container() {
  return (
    <div>
      <Header />
      <input type="submit" value="Login" onClick={login}></input>
      {/* if user sets in state then render <Dashboard /> else render error message  */}
    </div>
  );
}

export default Container;

在这里,test-header组件发布为 npm包工作正常。当我点击 Login按钮,我收到此错误:

react-dom.development.js?61bb:16178 Uncaught (in promise) Error: Invalid hook call. Hooks can only be called inside of the body of a function component.

如何检查是否 user已设置为状态或未设置,并基于该渲染 Dashboard组件 react-hooks

最佳答案

您没有从功能组件调用 Hook 。希望以下内容能解决您的疑虑。

import React, {useState, useEffect} from 'react';
import Header from 'test-header';
import Dashboard from 'test-dashboard';
import {api} from '../api';

const Container = props => {
  const [error, setError] = useState([]);
  const [user, setUser] = useState([]);
  function storeUser(user) {
    if (user) {
      localStorage.user = JSON.stringify(user);
    } else {
      delete localStorage.user;
    }
  }
  async function login() {
    try {
      const user = await api({
        endpoint: 'identity/login',
        method: 'POST',
        json: {
          email: 'test@abc.com',
          password: '12345',
        },
      });
    // call setUser only if credentials are correct
      if (validUser) {
        setUser(user);
        storeUser(user);
      }
    } catch (err) {
      setError(err);
    }
  }
  return (
    <div>
      <Header />
      <input type="submit" value="Login" onClick={login}></input>
      {user.length > 0 ? <Dashboard /> : error.length > 0 ? <Error /> : null}
    </div>
  );
};

export default Container;

关于javascript - React Hooks - 根据状态有条件地渲染组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59994481/

相关文章:

javascript - 已解决无论我尝试什么都无法让 CORS 工作

javascript - 将 css 编辑为 event.target

javascript - 使用 Webpack 外部组件并仍然允许 ES6 样式导入?

javascript - React 中的简单轮播 - 如何注册滚动到下一张幻灯片?

javascript - 在 Next.js 中导入 react-hook-mousetrap 时出现 "Cannot use import statement outside a module"错误

reactjs - react 钩子(Hook) : setState functionality on re-renders

javascript - Chrome 扩展仅在具有特定内容的类上注入(inject) css

javascript - cv::imcode将图像从JS解码到C++(opencv,emscripten)

javascript - 你如何使用 React.js 进行 SEO?

javascript - 如果登录应用程序如何重定向