Управление состоянием с помощью useContext и useReducer и выборка данных с помощью useEffect

У меня есть приложение React, которое управляет своим глобальным состоянием с помощью useContext и useReducer. Моему BookListcomponent необходимо получить книги с сервера при установке. Если получение книг прошло успешно, они должны быть сохранены в глобальном состоянии.

Мой подход выглядит следующим образом

function BookList() {
    const [state, dispatch] = useContext(BookContext);
    const [loading, setLoading] = useState(true);

    useEffect(() => {
        BookService
            .fetchBooks()
            .then(resp => {
                setLoading(false);
                dispatch({
                    type: FETCH_BOOKS,
                    books: resp.data
                });
            });
    }, []);

    return (
        <div>
            {loading
                ? "Loading ..."
                : state.books.map(book => (
                    <div key={book.id}>{`${book.title} - $${book.price}`}</div>))
            }
        </div>
    );
}

Это работает, но выдает предупреждение

У React Hook useEffect отсутствует зависимость: 'dispatch'. Или ...

Мне нужно добавить dispatch в массив зависимостей, чтобы избавиться от предупреждения, или есть лучший способ?


person f1nan    schedule 28.02.2020    source источник
comment
В основном да, но ссылка на эту функцию не изменится, поэтому на самом деле она необязательна.   -  person gadi tzkhori    schedule 28.02.2020


Ответы (1)


Предупреждение здесь не очень актуально, поскольку в документе предлагается исключить dispatch из списка зависимостей useEffect и useReducer, но вы можете безопасно поместить его в массив зависимостей, потому что идентичность функции dispatch для useReducer всегда стабильна.

в документе говорится:

React гарантирует, что dispatch идентификатор функции стабилен и не изменится при повторном рендеринге.
Вот почему можно безопасно исключить из списка зависимостей useEffect или useCallback.

person Fraction    schedule 28.02.2020