Как я могу исправить массивы зависимостей крючков?

#reactjs #react-hooks

#reactjs #реагирующие перехваты

Вопрос:

Я работаю над демонстрационным приложением, и у меня есть контролируемый поисковый ввод. Я пытаюсь отменить событие onChange, чтобы не запускать функцию выборки API при каждом ударе. Это работает, но я получаю предупреждение о массиве зависимостей:

 import React, { useState, useEffect, useCallback } from 'react';
import debounce from 'lodash/debounce'

[...]

const searchForMovies = (str) => {
    fetch(`https://api.themoviedb.org/3/search/movie?api_key=${process.env.REACT_APP_TMDB_API_KEY}amp;language=en-USamp;query=${str}amp;page=1amp;include_adult=false`)
    .then(response => response.json())
    .then(data => setMovies({movies: data.results}));
}

const handleChange = event => {
    const searchTerm = event.target.value
    setSearch({[event.target.name]: event.target.value});
    debounceSearch(searchTerm);
}

const debouncedSearch = useCallback(
    debounce((str) => searchForMovies(str), 500), []
);
 

Это работает, но я получаю React Hook useCallback received a function whose dependencies are unknown. Pass an inline function instead сообщение об ошибке. Согласно документации, я должен передавать зависимости в последний массив, но добавление либо debounce , searchForMovies либо str приводит к ошибке. Как именно я должен обрабатывать массив зависимостей, чтобы избежать этой проблемы?

Ответ №1:

создайте функцию вне вашего компонента

 const debouncedSearchForMovie = debounce((str) => searchForMovies(str), 500)
...
const debouncedSearch = useCallback(
    () => debouncedSearchForMovie(str), [debouncedSearchForMovie, str]
);
 

Ответ №2:

похоже, вы пытаетесь вызвать возвращаемое значение функции debounce, а не саму функцию.

обратите внимание на разницу между:

 useCallback(() => myFunction(), [dependency]); // function to invoke.
 

и

 useCallback(myFunction(), [dependency]); // this function has already been invoked.