#reactjs #caching #google-places-api
#reactjs #кэширование #google-places-api
Вопрос:
Итак, у меня есть следующий функциональный компонент, который работает нормально. То, что я хочу сделать, это кэшировать результаты, поэтому я не использую API снова и снова для одного и того же поискового запроса.
import React, { useState, useEffect, useRef } from "react";
import currentSession from "../currentSession";
let autoComplete;
const loadScript = (url, callback) => {
let script = document.createElement("script");
script.type = "text/javascript";
if (script.readyState) {
script.onreadystatechange = function () {
if (script.readyState === "loaded" || script.readyState === "complete") {
script.onreadystatechange = null;
callback();
}
};
} else {
script.onload = () => callback();
}
script.src = url;
document.getElementsByTagName("head")[0].appendChild(script);
};
function handleScriptLoad(updateQuery, autoCompleteRef) {
autoComplete = new window.google.maps.places.Autocomplete(
autoCompleteRef.current,
{ types: ["(cities)"] }
);
autoComplete.setFields(["address_components", "formatted_address"]);
autoComplete.addListener("place_changed", () =>
handlePlaceSelect(updateQuery)
);
}
async function handlePlaceSelect(updateQuery) {
const addressObject = autoComplete.getPlace();
const query = addressObject.formatted_address;
updateQuery(query);
}
function SearchLocationInput(props) {
const [query, setQuery] = useState("");
const autoCompleteRef = useRef(null);
useEffect(() => {
loadScript(
"https://maps.googleapis.com/maps/api/js?key="
currentSession.getGoogleApiKey()
"amp;libraries=places",
() => handleScriptLoad(setQuery, autoCompleteRef)
);
}, []);
return (
<div className="search-location-input">
<input
ref={autoCompleteRef}
onChange={(event) => {
props.onCityChange(event.target.value);
setQuery(event.target.value);
}}
placeholder="Enter a City"
value={query}
/>
</div>
);
}
export default SearchLocationInput;
Я предполагаю, что запрос выполняется в загруженном скрипте, поэтому я не уверен, как я могу это выполнить?
Комментарии:
1. Что вы в итоге сделали?
2. Поскольку это было невозможно, в конечном итоге я использовал собственное автозаполнение и использовал локальное хранилище для кэширования результатов. Так, например, если пользователь набрал «ab», api будет вызываться только в том случае, если кэшированные результаты не были в локальном хранилище. Написание моего собственного компонента автозаполнения было довольно простым и дало мне полный контроль над тем, как он себя ведет.