反应位置返回未定义

Posted

技术标签:

【中文标题】反应位置返回未定义【英文标题】:React Location returns undefined 【发布时间】:2021-03-29 14:59:30 【问题描述】:

我正在尝试获取天气应用的用户位置,但日志返回未定义

  const [lat, setLat] = useState();
  const [long, setLong] = useState();

  useEffect(() => 
    const handleLocation = () => 
      navigator.geolocation.getCurrentPosition((position) => 
        setLat(position.coords.latitude);
        setLong(position.coords.longitude);
      );

      console.log(lat);
      console.log(long);
    ;

    if (navigator.geolocation) 
      navigator.permissions.query( name: 'geolocation' ).then(function (result) 
        if (result.state === 'granted') 
          console.log(result.state);
          handleLocation();
         else if (result.state === 'prompt') 
          console.log('prompt');
         else if (result.state === 'denied') 
          console.log('Denied');
        
      );
    
  , [lat, long]);

我获得了日志,确认浏览器授予了该位置,但随后我得到了未定义的纬度和经度

【问题讨论】:

这能回答你的问题吗? useState set method not reflecting change immediately 你传递的函数:(position) => ... 在你的 console.log()s 之后运行。确定位置需要一些时间,并且浏览器不应该在等待期间挂起,这就是为什么你必须首先传递一个回调函数。设置状态也是异步的,所以即使没有获取到位置,你仍然会得到undefined 【参考方案1】:

我相信这是一个简单的异步问题。 navigator.geolocation.getCurrentPosition 是异步的,不会立即调用给定的函数。

我相信如果您将 console.log 移动到回调中,那么状态应该具有正确的值。

const handleLocation = () => 
  navigator.geolocation.getCurrentPosition((position) => 
    setLat(position.coords.latitude);
    setLong(position.coords.longitude);
    console.log(lat);
    console.log(long);
  );
;

还要记住,React 状态更新可以是异步的。测试latlong 变量的不同值的更好方法是在渲染函数中log 它们。

function Component() 
    const [lat, setLat] = useState()

    useEffect( /* your useEffect callback here */);

    console.log(lat); // you will see all the values of lat through time now

【讨论】:

我尝试了两种方法,但仍然未定义【参考方案2】:

发现错误是操作系统阻止了浏览器的定位服务

【讨论】:

以上是关于反应位置返回未定义的主要内容,如果未能解决你的问题,请参考以下文章

无法读取未定义反应挂钩的属性“位置”

由于未定义的getCurrentPosition,反应本机地理位置不起作用

阿波罗客户端在反应原生的初始重新加载中返回未定义

使用 useQuery 进行批处理反应钩子返回未定义

反应路由器 useparams 以未定义的形式返回

更新时反应钩子状态未定义