Использование useDispatch в пользовательском хуке приводит к ошибке - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь реализовать useDispatch в пользовательском хуке, который отправляет действие приведения, но я получаю следующую ошибку:

Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app

CODE:

файл модулей

import { useDispatch, useSelector } from 'react-redux'

export function useFetchEvents() {
  const dispatch = useDispatch()
  const { items, loading } = useSelector(state => state.events)
  if (items.length === 0) {
    dispatch(requestEvents(true))
  }
}

функциональный компонент

import { useFetchEvents } from '../../../modules/events'

const FrontPage = () => {
  return(
    <div>
      Front Page
      <button onClick={useFetchEvents}>
        Fetch events
      </button>
    </div>
  )
}

export default FrontPage

Я видел ошибку и читал правила, касающиеся хуков, но если я правильно понимаю, я смогу использовать useDispatchв кастом крюке. Как и в следующих рабочих примерах:

https://github.com/mikeour/drinks_drinks_drinks/blob/master/src/hooks/index.js

1 Ответ

0 голосов
/ 24 октября 2019

Тогда количество вызовов ловушек в каждом вызове должно быть одинаковым (вот почему вы не можете вызывать ловушки внутри if операторов).

Для достижения этой useFetchEvents ловушка должна возвращать функцию, котораяможно условно вызвать, например, onClick

изменить useFetchEvents примерно так:

export function useFetchEvents() {
  const dispatch = useDispatch()
  const { items, loading } = useSelector(state => state.events)
  return () => {
      if (items.length === 0) {
        // Redux action. requestEvents returns object with type.
        dispatch(requestEvents(true))
      }
  }
}

Затем в вашем компоненте сделать это:

const FrontPage = () => {
  const fetchEvents = useFetchEvents()

  return(
    <div>
      Front Page
      <button onClick={() => fetchEvents()}>
        Fetch events
      </button>
    </div>
  )
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...