简体   繁体   English

如何在 React 中使用钩子?

[英]How to use a hook in React?

I have information in the state ( true or false ) that I want to display if is true this Navbar component, but when I use the hook, I get an error message: hook error我有状态( truefalse )的信息,我想显示这个Navbar组件是否为真,但是当我使用钩子时,我收到一条错误消息:钩子错误

My code:我的代码:

import React from 'react';
import { BrowserRouter } from 'react-router-dom';
import { Provider } from 'react-redux';
import { ConnectedRouter } from 'connected-react-router';

import store, { history } from './reduxStore';
import AppRouterContainer from './pages/AppRouterContainer';

import Feedback from './pages/feedback/Feedback';
import Navbar from './components/Navbar/Navbar';
import { useTypedSelector } from '../src/hooks/useTypedSelector';

const isAuth = useTypedSelector((state) => state.auth.isAuth);

const App = () => (
  <BrowserRouter>
    <Provider store={store}>
      <ConnectedRouter history={history}>
        <AppRouterContainer />
        {isAuth && (
          <Navbar />
        )}
        <Feedback />
      </ConnectedRouter>
    </Provider>
  </BrowserRouter>
);

export default App;
  1. You need to create a wrapper component to have access to store in your context (I think your useTypedSelector() hook needs that access).您需要创建一个包装器组件才能访问存储在您的上下文中(我认为您的useTypedSelector()钩子需要该访问权限)。
  2. You can use hooks only inside a function, not just inside a module.您只能在函数内部使用钩子,而不仅仅是在模块内部。

Check out this example:看看这个例子:

import React from 'react';
import { Provider } from 'react-redux';
import { BrowserRouter } from 'react-router-dom';
import { ConnectedRouter } from 'connected-react-router';

import { useTypedSelector } from '../src/hooks/useTypedSelector';
import Navbar from './components/Navbar/Navbar';
import AppRouterContainer from './pages/AppRouterContainer';
import Feedback from './pages/feedback/Feedback';
import store, { history } from './reduxStore';

const NavbarWrapper = () => {
  const isAuth = useTypedSelector((state) => state.auth.isAuth);

  if (!isAuth) {
    return null;
  }

  return <Navbar />;
};

const App = () => (
  <BrowserRouter>
    <Provider store={store}>
      <ConnectedRouter history={history}>
        <AppRouterContainer />
        <NavbarWrapper />
        <Feedback />
      </ConnectedRouter>
    </Provider>
  </BrowserRouter>
);

export default App;

Also, I think you should move the NavbarWrapper component to a separate file.另外,我认为您应该将NavbarWrapper组件移动到一个单独的文件中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM