У меня были проблемы с определением того, чего пытался достичь ваш codepen и функция anotherPage, поэтому я предоставляю вам этот codepen . Откройте его в двух разных окнах и посмотрите общее количество уведомлений.
Обратите внимание, что предлагаемое решение Local Storage работает только в том же браузере, поскольку браузеры не используют свои локальные хранилища.
Здесь, как синхронизировать локальное хранилище между двумя окнами, не делая удаленного вызова API:
Сначала позвольте добавить прослушиватель событий . Первый аргумент - это тип события (здесь мы слушаем память), второй - обратный вызов. Обратите внимание, что прослушивание события storage работает только между двумя окнами (обновление хранилища из окна не вызовет собственного слушателя):
componentDidMount() {
window.addEventListener("storage", this.handleStorageUpdate);
}
Не забудьте удалить этот прослушиватель , когда вы больше его не используете (возможно, на componentWillUnmount), чтобы предотвратить любое раздувание.
componentWillUnmount() {
window.removeEventListener("storage", this.handleStorageUpdate);
}
Теперь давайте посмотрим на нашего слушателя . Он получит все изменения хранилища, но мы хотим только прослушать уведомления об изменениях. При изменении уведомлений в хранилище мы хотим обновить состояние нашего компонента, чтобы запустить повторное рендеринг с новым значением:
handleStorageUpdate = storageChange => {
if (storageChange.key === "notifications") {
this.setState(() => ({ notifications: Number(storageChange.newValue) }));
}
};
Итак, теперь у нас есть два окна, которые слушают изменения, сделанные друг другом.
Давайте просто дадим способ увеличить количество уведомлений:
handleIncreaseNotification = () => {
const notifications = this.state.notifications + 1;
localStorage.setItem("notifications", notifications);
this.setState(() => ({ notifications }));
};
При увеличении количества уведомлений вы устанавливаете пункт «Локальное хранилище», который будет использоваться другим окном. Поскольку вы не слушаете свои собственные изменения локального хранилища, вам нужно установить новое состояние для этого состояния уведомлений.
Поскольку вы хотите видеть количество уведомлений непосредственно при открытии окна, не забудьте получить значение локального хранилища в одном из самых ранних состояний жизненного цикла вашего компонента:
constructor(props) {
super(props);
const notifications = localStorage.getItem("notifications") || 0;
this.state = { notifications: Number(notifications) };
}
Наконец, вы можете отобразить весь компонент:
render() {
const { notifications } = this.state;
return (
<div>
<div> I have {notifications} notifications</div>
<button onClick={this.handleIncreaseNotification}>increase</button>
</div>
);
}