gribnoysup / react-yandex-maps

Yandex Maps API bindings for React
MIT License
329 stars 116 forks source link

Компонент как то странно себя с Route #70

Closed xfishernet closed 6 years ago

xfishernet commented 6 years ago

Компонент как то странно себя с Route. Если перейти на карту, потом на какой то другой маршрут, потом опять на карту, то будет ошибка:

at Map.update (Map.js:114) at Map.componentWillReceiveProps (Map.js:147) at callComponentWillReceiveProps (react-dom.development.js:11527)

gribnoysup commented 6 years ago

Привет, маленькое демо с репродукцией ошибки очень помогло бы понять в чем может быть причина

xfishernet commented 6 years ago

https://codesandbox.io/s/21145v40z0

сначала переходим на ссылку /map

потом кликаем на TEST ссылку

я конечно могу в событии сделать проверку if (!map) return; там где ошибка, но хотелось бы узнать, почему именно то событие выполняется, когда перехожу по ссылке.

mmarkelov commented 6 years ago

@xfishernet react-yandex-maps will call the instanceRef callback with the YandexMap Object instance when the component mounts, and call it with null when it unmounts. Тут конечно @gribnoysup подробнее пояснит. Но просто надо делать доп проверки на существование https://codesandbox.io/s/34lr1w48r1

gribnoysup commented 6 years ago

@xfishernet как правильно заметил @mmarkelov происходит это потому что instanceRef коллбэк будет вызван c аргументом null, когда React вызывает коллбэк componentWillUnmount. Это поведение повторяет поведение callback refs в React:

React will call the ref callback with the DOM element when the component mounts, and call it with null when it unmounts.

https://reactjs.org/docs/refs-and-the-dom.html#callback-refs

Я закрою issue, но если у тебя остались вопросы, спрашивай

MaGaKZ commented 5 years ago

Хочу выразить огромную благодарность вам. Но я хотел спосить об одной ошибке которая выходит у меня:

Can't perform a React state update on an unmounted component. This is a no-op, but it indicates a memory leak in your application. To fix, cancel all subscriptions and asynchronous tasks in the componentWillUnmount method. in YandexMapWrap

Я пробывал исправить это так:

class YandexMapWrap extends React.Component {
  _isMounted = false;
  componentDidMount() {
    this._isMounted = true;
  }

  componentWillUnmount() {
    this._isMounted = false;
  }
}

и каждый раз проверяю на это когда вызываю this.setState() но похожо что это не помогает. Не могли вы подсказать почему так выходит и как исправить это ?

Thanks in advance!