Результаты поиска React cache Google places api

#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 будет вызываться только в том случае, если кэшированные результаты не были в локальном хранилище. Написание моего собственного компонента автозаполнения было довольно простым и дало мне полный контроль над тем, как он себя ведет.