由于 HTML 地理位置是异步的,render() 调用可以进入地理位置成功回调:
if (navigator.geolocation){
function success(position) {
var latitude = position.coords.latitude;
var longitude = position.coords.longitude;
ReactDOM.render(
<Main lat={ latitude } lon={ longitude } />, document.getElementById('container')
);
};
function error() {
console.log( 'geolocation error' )
};
navigator.geolocation.getCurrentPosition(success, error);
}
https://jsfiddle.net/69z2wepo/62204/
更高级的示例是执行地理定位并将坐标传递给包装组件的高阶组件。然后,包装的组件应检查 componentWillReceiveProps 方法中的坐标,并在道具非空时执行 AJAX 请求:
var GeoComponent = Component => React.createClass({
getInitialState(){
return {
lat : null,
lon : null
}
},
componentDidMount(){
navigator.geolocation.getCurrentPosition(this.setCoordinates, err => console.log( err ));
},
setCoordinates( position ){
this.setState({
lat : position.coords.latitude,
lon : position.coords.longitude
})
},
render(){
return <Component lat={ this.state.lat } lon={ this.state.lon } { ...this.props } />;
}
});
var Main = React.createClass({
componentWillReceiveProps( nextProps ){
if( nextProps.lat && nextProps.lon ){
console.log( 'received coords!' );
/*
this.serverRequest = $.get(this.props.source, function (result) {
this.setState({
daily: result.daily.data,
hourly: result.hourly.data
});
}.bind(this));
*/
}
},
render(){
return <div>Latitude: { this.props.lat }, Longitude: { this.props.lon }</div>;
}
});
ReactDOM.render(
React.createElement(GeoComponent(Main )),
document.getElementById('container')
);
https://jsfiddle.net/69z2wepo/62205/