Причина, по которой вы не видите данные после первого щелчка, заключается в том, что у вас еще нет данных из doFetch
сразу после их вызова.
Во второй раз, когда вы нажимаете кнопку, чтобывызов handleClickSelectInterests
данные записываются, но это данные первого рендера. Вы можете просто отрисовать обновленные данные, но вы не можете записывать самые последние данные в функцию handleClick
.
Вот пример, чтобы показать, что я имею в виду:
Пример песочницы кода
Корневой компонент:
import React from "react";
import ReactDOM from "react-dom";
import useHopServiceApi from "./useHopServiceApi";
import "./styles.css";
function App() {
const [{ data, isLoading, isError }, doFetch] = useHopServiceApi();
console.log("Data in render!", data);
const handleClick = () => {
doFetch("/fakeUrl");
// Data logged below will show the data from the previous request, not the latest
console.log("Data in handle click!", data);
};
return (
<div className="App">
{isLoading && <div>Is loading!</div>}
<button onClick={handleClick}>Simulate fetch!</button>
{data && <div>Data! {data}</div>}
</div>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);
ВашКрюк:
import { useState, useEffect } from "react";
let numClick = 1;
const simulatedFetch = () => {
return new Promise(resolve => {
setTimeout(() => {
resolve(`Fetch request data for request number ${numClick}`);
numClick++;
}, 2000);
});
};
const useHopServiceApi = () => {
const [data, setData] = useState([]);
const [url, setUrl] = useState("");
const [body, setBody] = useState({});
const [isLoading, setIsLoading] = useState(false);
const [isError, setIsError] = useState(false);
useEffect(() => {
const fetchData = async () => {
setIsError(false);
setIsLoading(true);
try {
const result = await simulatedFetch();
console.log("new result!", result);
setData(result);
setUrl("");
} catch (error) {
setIsError(true);
}
setIsLoading(false);
};
if (url) {
fetchData();
}
}, [url, body]);
return [{ data, isLoading, isError }, setUrl, setBody];
};
export default useHopServiceApi;
Приведенный выше пример показывает, что вы можете использовать самые последние данные в функции рендеринга, даже если вы не можете войти в них в handleClick
функции