Вы можете сделать это так, как вы выбрали, но есть и другие способы решения этой проблемы.
Другим способом будет всегда повторная загрузка всякий раз, когда URL-адрес изменения, без явного сеттера, возвращенного из ловушки. Это будет выглядеть примерно так:
export const useOurApi = (url, initialData) => { // URL passed directly through removes the need for a specific internal url `useState`
// const [url, setUrl] = useState(initialUrl); // No longer used
// ...
useEffect(() => {
// Handle fetch
}, [url]);
return { isLoading, hasError, data: fetchedData }; // No more `setUrl`
};
Это может не всегда быть тем, что вы хотите, хотя иногда вам может не потребоваться повторно получать все данные при каждом изменении URL, например, если URL пуст , вы можете не захотеть обновлять URL. В этом случае вы можете просто добавить useEffect
в пользовательский хук useOurApi
, чтобы обновить внутренний URL-адрес и повторить выборку:
export const useOurApi = (initialUrl, initialData) => {
const [url, setUrl] = useState(initialUrl);
// ...
useEffect(() => {
// Handle fetch
}, [url]);
useEffect(() => {
// ... do some permutation to the URL or validate it
setUrl(initialUrl);
}, [initialUrl]);
return { isLoading, hasError, data: fetchedData }; // No more `setUrl`
};
Если вам все еще иногда требуется повторно получить данные, не связанные на URL, вы можете вывести некоторую функцию из ловушки, чтобы вызвать выборку данных. Примерно так:
export const useOurApi = (initialUrl, initialData) => {
const [url, setUrl] = useState(initialUrl);
const [isLoading, setIsLoading] = useState(true);
const [hasError, setHasError] = useState(false);
const [fetchedData, setFetchedData] = useState(initialData);
const refetch = useCallback(() => {
// Your fetch logic
}, [url]);
useEffect(() => {
refetch(); // In case you still want to automatically refetch the data on url change
}, [url]);
return { isLoading, hasError, refetch, data: fetchedData };
};
Теперь вы можете звонить refetch
всякий раз, когда хотите запустить повторное извлечение. Возможно, вы все еще захотите изменить внутреннюю ссылку, но это даст вам еще один более гибкий доступ к извлечению и когда это происходит.