React Hooks, useReducer не может получить состояние - PullRequest
0 голосов
/ 02 ноября 2018

Я делаю простой компонент, пытаясь использовать хуки useEffect и useReducer. Кажется, все работает нормально, за исключением того, что ни один из элементов в массиве фактически не попадает в компонент. Я сделал несколько операторов console.log внутри различных функций, и я вижу, что вызов API успешен и что данные доступны в области функции в событиях. Тем не менее, все, что визуализируется, это пустое поле. Мой код:

import React, { useReducer, useEffect } from "react";
import "./App.css";

const  App = () => {
  const [events, dispatch] = useReducer(
      (state, action) => { switch (action.type) {
          case "fetchEvents":
              state = [ ...state, action.data];
             return state;

            case "removeEvent":
              return state.filter((_, idx) => idx !== action.idx);

            default:
                console.log(state);
              return state;
        }
      },
  []);

  useEffect(async () => {
    const response = await fetch("https://easynode-veohkvapci.now.sh/api/test");
    const data = await response.json();
    dispatch({type: "fetchEvents", data});
  },[]);

  console.log(events, 'log events');

  return (
      <div>
          {events.map((event, idx) => (
              <div key={event.event_url} style={{ border: "solid" }}>
                  <p>{event.name}</p>
                  <p>{event.date}</p>
                  <p>{event.description}</p>
                <button onClick={() => dispatch({ type: "removeEvent", idx})}>Remove Event</button>
              </div>
          ))}
      </div>
  );
};

export default App;

Должен ли я вместо этого вызывать useEffect внутри useReducer? Я мог бы испортить что-то, что должно происходить асинхронно.

1 Ответ

0 голосов
/ 02 ноября 2018

Данные, полученные в ответ на ваш запрос, являются массивом, поэтому вам необходимо убедиться, что вы также распространяете их в случае fetchEvents в вашем редукторе.

const [events, dispatch] = useReducer((state, action) => {
  switch (action.type) {
    case "fetchEvents":
      state = [...state, ...action.data];
      return state;

    case "removeEvent":
      return state.filter((_, idx) => idx !== action.idx);

    default:
      return state;
  }
}, []);
...