Я работал с Leaflet Routing Machine в React и хочу иметь возможность использовать границы ошибок, чтобы справляться с ошибками маршрутизации, особенно когда демо-маршрутизация реагирует так (из того, что я прочитал, она относительно нестабильна, поскольку еедля демонстрационных целей):
Routing error: {message: "HTTP request failed: undefined", url: "https://router.project-osrm.org/route/v1/driving/8…erview=false&alternatives=true&steps=true&hints=;", status: -1, target: XMLHttpRequest}
Мне кажется, что ErrorBoundary не работает из документации:
https://reactjs.org/blog/2017/07/26/error-handling-in-react-16.html
Я думаю, что я подхожу к этому неправильно?
App.js
import React, { Component } from "react";
import { Map, TileLayer } from "react-leaflet";
import Routing from "./RoutingMachine";
import ErrorBoundary from "./ErrorBoundary"
class App extends Component {
state = {
lat: 57.74,
lng: 11.94,
zoom: 13,
isMapInit: false
};
saveMap = map => {
this.map = map;
this.setState({
isMapInit: true
});
};
render() {
const position = [this.state.lat, this.state.lng];
return (
<Map center={position} zoom={this.state.zoom} ref={this.saveMap}>
<TileLayer
attribution='&copy <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
url="http://{s}.tile.osm.org/{z}/{x}/{y}.png"
/>
{this.state.isMapInit && <ErrorBoundary><Routing map={this.map}/></ErrorBoundary>}
</Map>
);
}
}
export default App;
RoutingMachine.js
import { MapLayer } from "react-leaflet";
import L from "leaflet";
import "leaflet-routing-machine";
import { withLeaflet } from "react-leaflet";
class Routing extends MapLayer {
createLeafletElement() {
const { map } = this.props;
let leafletElement = L.Routing.control({
waypoints: [L.latLng(27.67, 85.316), L.latLng(27.68, 85.321)]
}).addTo(map.leafletElement);
return leafletElement.getPlan();
}
}
export default withLeaflet(Routing);
ErrorBoundary.js
import React, { Component } from 'react';
class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
componentDidCatch(error, info) {
// Display fallback UI
this.setState({ hasError: true });
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
export default ErrorBoundary;