Есть 2 проблемы.
1. Ваша выборка получает новое значение каждый раз, так как она имеет состояние в качестве зависимости, и это вызывает запуск useEffect каждый раз, так что бесконечный цикл.
2.useEffect имеет аргументы в качестве зависимости, которая также не всегда одинакова, вам не нужно передавать аргументы для извлечения, поскольку она уже доступна из-за закрытия.
вот обновленный код, который не входит в бесконечный цикл. у вас могут возникнуть проблемы с ворсом, но вы должны игнорировать их, пока этот мусор не станет более стандартным.
const useFetch = (promise, args = [], options = {}) => {
const [state, setState] = React.useState({
loading: false,
data: null,
error: null
});
if (!args) args = [];
const fetch = React.useCallback(() => {
setState({
...state,
loading: true,
error: null
});
return promise(...args)
.then(response => {
setState({
...state,
loading: false,
data: response
});
return response;
})
.catch(error => {
setState({
...state,
loading: false,
error
});
});
}, [promise]);
React.useEffect(() => {
if (options.now) {
fetch();
}
}, [fetch, options.now]);
return {
fetch,
...state
};
};
const allUsers = () => Promise.resolve([{ name: 'Bruno' }])
const App = props => {
const { data } = useFetch(allUsers, [], { now: true });
console.log(data, "=>");
return <input name="name" onChange={this.handleInputChange} />;
}