当前位置: 首页 > 知识库问答 >
问题:

来自另一个功能组件的设置状态

洪弘壮
2023-03-14

我刚刚从反应类过来,开始思考钩子和功能组件。我有一段加载地图脚本的代码

let autoComplete;
// dynamically load JavaScript files in our html with callback when finished
const loadScript = (url, callback) => {
  let script = document.createElement("script"); // create script tag
  script.type = "text/javascript";

  // when script state is ready and loaded or complete we will call callback
  if (script.readyState) {
    script.onreadystatechange = function () {
      if (script.readyState === "loaded" || script.readyState === "complete") {
        script.onreadystatechange = null;
        callback();
      }
    };
  } else {
    script.onload = () => callback();
  }

  script.src = url; // load by url
  document.getElementsByTagName("head")[0].appendChild(script); // append to head
};

// handle when the script is loaded we will assign autoCompleteRef with google maps place autocomplete
function handleScriptLoad(updateQuery, autoCompleteRef) {
  // assign autoComplete with Google maps place one time
  autoComplete = new window.google.maps.places.Autocomplete(
    autoCompleteRef.current,
    {
      types: ["establishment"],
      strictBounds: true,
      fields: ["address_components", "name", "geometry"],
      componentRestrictions: { country: "us" },
    }
  );
  autoComplete.setFields(["address_components", "formatted_address"]); // specify what properties we will get from API
  // add a listener to handle when the place is selected
  autoComplete.addListener("place_changed", async () => {
    handlePlaceSelect(updateQuery);
  });
}

我需要从下面的函数中设置状态或更新状态,但它不是保持状态的主函数

function handlePlaceSelect(updateQuery) {
  const [coodinates, setCoordinates] = useState({
    lat: null,
    lng: null,
  });

  const addressObject = autoComplete.getPlace(); // get place from google api
  const query = addressObject.formatted_address;
  updateQuery(query);
  var address = "";
  if (addressObject.address_components) {
    address = [
      (addressObject.address_components[0] &&
        addressObject.address_components[0].short_name) ||
        " , ",
      (addressObject.address_components[1] &&
        addressObject.address_components[1].short_name) ||
        " , ",
      (addressObject.address_components[2] &&
        addressObject.address_components[2].short_name) ||
        " , ",
    ].join(", ");
  }
  var completeAddress = addressObject.name + ", " + address;
  console.log(completeAddress);
  console.log("Latitude: " + addressObject.geometry.location.lat());
  console.log("Longitude: " + addressObject.geometry.location.lng());

  /// heres where am trying to update state of coordinates when a place is changed
 setCoordinates({
   lat: addressObject.geometry.location.lat(),
   lng: addressObject.geometry.location.lng()

 })
} 

下面的主要功能是加载use效果中的映射脚本

function Storelocation({ setTab }) {
  const [query, setQuery] = useState("");

  const autoCompleteRef = useRef(null);

  const [address, setAddress] = React.useState("");
  const [coordinates, setCoordinates] = React.useState({
    lat: null,
    lng: null
  });

  useEffect(() => {
    loadScript(
      `https://maps.googleapis.com/maps/api/js?key=AIzaSyCT2wFvkG_abY&libraries=places`,
      () => handleScriptLoad(setQuery, autoCompleteRef)
    );
  }, []);

return (
 <input
              className=""
              required
              placeholder="address"
              ref={autoCompleteRef}
              onChange={(event) => {
                setQuery(event.target.value)
              }}
             defaultValue={query}
            ></input>

);
}

如何使用这种方式更新状态,即从另一个函数更新状态

共有1个答案

祁宝
2023-03-14

您可以将一个函数从stateful组件传递给您的子组件,该子组件使用setState为您管理状态更改。

 类似资料:
  • 假设我有以下名为Home的组件: 在PostForm组件与新Post一起提交后,我将如何更新主状态,或者如何从api重新获取数据。

  • 假设我有以下功能文件: 我ogin.feature 功能:登录网站 场景:现场登录验证 给定导航到站点登录页 家特色 功能:欢迎页面验证 场景:验证登录后出现的页面 已成功完成给定登录 登录成功后的页面出现时 然后测试完成 在Home.feature文件中,我需要先执行Login.feature,然后调用home.feature.所以当我从运行器测试中执行home时,它会依次执行login,然后是

  • 问题内容: 我正在尝试将在这里找到的这个很棒的动画转换为React可重用的组件。看来此组件将需要一个父组件作为画布,而许多子组件则为。 出于性能方面的考虑,将它们变成无状态组件可能会更好,因为会有很多这样的组件。我不熟悉制作无状态组件,并且想知道应该在哪里定义和中定义的和函数。 无状态组件的功能是在组件内部还是外部?换句话说,以下哪个更好? 1: 2: 每种都有什么优点/缺点,其中哪一种对我的特定

  • 问题内容: 当我用酶测试类组件时,我可以设置状态。当我用钩子测试功能组件时,现在该怎么做? 例如,在我的组件中,我有: 我想在测试中进行更改 问题答案: 使用挂钩状态时,您的测试必须忽略诸如状态之类的实现细节,以便对其进行正确测试。您仍然可以确保组件将正确的状态传递到其子级。 您可以在Kent C. Dodds撰写的这篇博客文章中找到一个很好的例子。 这是摘录的代码示例。 依赖状态执行细节的测试-

  • 在不使用类的情况下,如何在react的功能性无状态组件中使用PropTypes?

  • 我试图使用来自另一组主机[etcd]的事实来配置一组主机[节点]。这是我的主机文件 请注意,组[etcd]不是供应的目标,[nodes]是。但是提供[节点]需要了解[etcd]的事实。 当我运行这个playbook时,我得到控制台输出 使etcd事实对节点播放可用的惯用Ansible方法是什么?