【问题标题】:How to return values from UseEffect Hook如何从 UseEffect Hook 返回值
【发布时间】:2021-09-24 11:06:56
【问题描述】:

我从使用效果钩子(我相对较新)中获取纬度和经度。我想返回使用效果钩子之外的值并将它们存储在变量中,如果需要的话甚至存储在状态中。我可以控制台记录值,但我只是添加一个返回语句或以某种方式传递参数吗?我需要使用什么功能?我计划将 lat 和 long 数据传递到代码的其他部分,这就是我尝试从 useEffect 挂钩中检索它的原因。

useEffect(() => {
    if ("geolocation" in navigator) {
      console.log("Available");
    } else {
      console.log("Not Available");
    }
    navigator.geolocation.getCurrentPosition(function (position) {
      let lat = position.coords.latitude;
      let long = position.coords.longitude;
      console.log(lat);
      console.log(long);
    });
  }, []);
let newLat = lat?
let newLong = long?

【问题讨论】:

    标签: reactjs arguments parameter-passing use-effect


    【解决方案1】:

    您可以将它们保存在状态或引用挂钩中。

    以下是我将如何使用参考挂钩:

    const lat = useRef(null);
    const long = useRef(null);
    
    useEffect(() => {
        if ("geolocation" in navigator) {
          console.log("Available");
        } else {
          console.log("Not Available");
        }
        navigator.geolocation.getCurrentPosition(function (position) {
          lat.current = position.coords.latitude;
          long.current = position.coords.longitude;
          console.log(lat);
          console.log(long);
        });
      }, []);
    

    然后您可以使用.current 访问latlong 值。更改它们不会触发重新渲染。

    如果你想使用状态,你可以这样做

    const [lat, setLat] = useState(null);
    const [long, setLong] = useState(null);
    
    useEffect(() => {
        if ("geolocation" in navigator) {
          console.log("Available");
        } else {
          console.log("Not Available");
        }
        navigator.geolocation.getCurrentPosition(function (position) {
          setLat(position.coords.latitude);
          setLong(position.coords.longitude);
          console.log(lat);
          console.log(long);
        });
      }, [setLat, setLong]);
    

    您可以像使用任何正常状态一样使用它们。

    在尝试使用它们时,还要确保它们的值不为空。

    【讨论】:

      【解决方案2】:

      你可以试试 useState 和 useEffect

      const [state, setState] = useState(initialState);
      

      initialState 可以是字符串、数字、对象或数组等。 您只能使用 setState 来更改状态的值。 您可以返回您的值并放入状态并在 useEffect 之外使用它。 如果你的值需要 preState,记得在 setState 中传递一个箭头函数,并将 preState 作为参数传递。

      【讨论】:

      • 谢谢!对于我的场景,useRef 有效,但我明白你的意思!
      【解决方案3】:

      Use 必须在 useEffect 之外设置 lat 和 long 你可以试试这个:

      let lat, long;
      
      useEffect(() => {
          if ("geolocation" in navigator) {
            console.log("Available");
          } else {
            console.log("Not Available");
          }
          navigator.geolocation.getCurrentPosition(function (position) {
            lat = position.coords.latitude;
            long = position.coords.longitude;
            console.log(lat);
            console.log(long);
          });
        }, []);
      

      您的 lat 和 long 变量将没有值,因为它在 useEffect 内部启动

      【讨论】:

      • 这是我最初的问题,但我认为下面可能更“反应”。谢谢你,虽然它有帮助!
      • 这实际上不起作用,并且会导致 let 和 long 值重置回 undefined 每次重新渲染。这是example
      猜你喜欢
      • 2021-03-04
      • 2020-07-16
      • 2019-10-08
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 2020-10-22
      • 2023-02-04
      相关资源
      最近更新 更多