Как обновить URL с координатами карты? - PullRequest
0 голосов
/ 15 ноября 2018

У меня в приложении React карта Leaflet, и я хотел бы динамически обновлять URL-адрес с информацией о положении (широта, долгота и масштаб) при перемещении карты.

Что-то вроде: app.com/lat,lng,z/myroutes

Кроме того, значения lat, lng, z должны иметь значения по умолчанию, чтобы приложение могло запускаться с app.com и перенаправлять.

В Leaflet есть прослушиватель событий onMoveend, который дает мне информацию, которую я хочу. Вопрос в том, как передать его моему маршрутизатору, чтобы он обновлял URL-адрес и внутренние ссылки приложения.

Я использую реагирующий маршрутизатор v4 для маршрутов.

Я пытался создать пользовательский объект истории со свойством basename, привязанным к состоянию, и затем передать его маршрутизатору. Он работает (с точки зрения обновления URL-адреса - в данном случае базового имени), но навигация в приложении дает сбой, и консоль говорит: «Вы не можете изменить историю маршрутизатора».

Это компонент, который обновляет URL (this.props.map из магазина Redux):

componentDidUpdate(prevProps) {
  if (this.props.map !== prevProps.map) {
    const { lat, lng, z } = this.props.map
    this.setState({ lat, lng, z })
  }
}

render() {
  const { lat, lng, z } = this.state

  if (lat && lng && z) {

    const history = createBrowserHistory({
      basename: `@${lat},${lng},${z}`
    })

    return (
      <Router history={history}>
        <Main>
          <Switch>
            <Route exact path='/farms' component={FarmsList} />
            <Route exact path='/farms/new' component={NewFarm} />
            <Redirect from='*' to='/farms' />
          </Switch>
        </Main>
      </Router>
    )
  } else {
    ...
  }
}

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Я сделал именно эту вещь для сайта, который я создал. Не использовал react-router, но использовал свой собственный маленький парсер URL для обновления URL и информирования redux о параметрах URL при загрузке страницы.

https://github.com/jbccollins/metro-monitor/blob/master/client/src/containers/app/index.js#L55

Вот где он вызывается с помощью onMoveEnd https://github.com/jbccollins/metro-monitor/blob/master/client/src/containers/MetroMap/index.js#L269

Обратите внимание, что я добавил проверку, чтобы убедиться, что вы не сохраняете уровни дробного масштабирования, которые могут произойти с помощью мобильного масштабирования. Это действительно запутало листовку и привело к краху моего приложения.

Надеюсь, это поможет

0 голосов
/ 16 ноября 2018

Просто вставьте новый URL в стек истории,

window.history.pushState({/*empty state object*/}, "example name", "/`@${lat},${lng},${z}`");

чтобы изменить URL, не заставляя браузер загрузить новую страницу

ознакомьтесь с документацией

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...