javascript - ReactJS 生命周期方法不按顺序工作

标签 javascript reactjs react-router react-google-maps

我正在使用 ReactJS 进行 Google map 渲染。为此,我正在使用“react-google-maps”库。逻辑流程是;在页面加载时,获取用户的位置并将其绘制在 map 上。 向用户提供导航链接以点击不同的 URL。为了处理导航,我使用 React 路由器。在 componentWillMount() 中识别用户的位置,然后相应地设置状态并在 render() 中渲染 map 。 问题是 render() 在完成 componentWillMount() 之前被调用,它获取空值并且失败。这种情况只出现在客户端路由中,不会出现在服务端渲染中。

为了限制执行方式,我将 componentWillMount() 作为异步方法,它会等待直到确定用户的位置。尽管如此,这仍然没有帮助。

state = {
        homeLocation: {},
        coordinates: []
    }

async componentWillMount(props) {
        const { lat,lng } = await this.getcurrentLocation();
        this.setState({
            homeLocation:{
                lat: lat, 
                lng: lng
            }
        })
    }

getcurrentLocation() {

        if (window.navigator && window.navigator.geolocation) {
          return new Promise((resolve, reject) => {
            window.navigator.geolocation.getCurrentPosition(pos => {
              const coords = pos.coords;
              resolve({
                lat: coords.latitude,
                lng: coords.longitude
              });
            });
          });
        }
        return {
          lat: 0,
          lng: 0
        };
      }
render(){

   <MapWithAMarker
   // necessary parameters
  />
}

//Routers
const AppRouter = () => (
    <Router>
        <div>
            <Switch>
                <Route path="/" component={MapHomeLocation} exact={true}/>
                <Route path="/location/:locationType" component={MapSelectedLocation}/>
                <Route component={Notfound}/>
            </Switch>
        </div>

    </Router>
);


The expected result is that coordinates should be determined first then render() should get called. In server-side routing(i.e. using anchor tags instead of <Link>) it works as expected.

最佳答案

您应该像这样检查数据是否存在,然后只给出值。

如果数据 && data.length > 0 ?数据:空

关于javascript - ReactJS 生命周期方法不按顺序工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311377/

相关文章:

javascript - 删除一个 View 并单击再次打开它,就好像它是新的一样 - SAPUI5

javascript - 使用 AJAX 集成 Asana API

javascript - React Class如何在同一文件中的所有方法中传递变量

javascript - 如何解决react-router中的 "TypeError: Cannot read property ' push' of undefined“?

javascript - Electron 上的 react 路由器无法改变历史

javascript - 如何使用 react 路由器

javascript - 我可以将每个元素用于动态创建的元素吗?

reactjs - 在 Material Design Light 和 React 中动态设置 Textfield 值时标签不 float

javascript - React Router 问题 : why history. 推送更改 url 但不更新组件

javascript - 为什么构造函数返回与自身同名的对象