Поиск по сайту:

Как синхронизировать магазин Redux между вкладками браузера


Redux — это удобный способ управления состоянием в сложных веб-приложениях. Однако ваш магазин Redux не синхронизируется между вкладками, что может привести к некоторым неловким сценариям. Если пользователь выходит из системы на одной вкладке, было бы идеально, если бы это действие отражалось на других его открытых вкладках.

Вы можете добавить синхронизацию хранилища кросс-таблиц с помощью библиотеки react-state-sync. Это обеспечивает промежуточное ПО, которое автоматически синхронизирует хранилище между вкладками. Вам не нужно вручную вмешиваться в процесс синхронизации после первоначальной настройки.

Обзор

Библиотека Redux State Sync предлагает промежуточное ПО Redux, которое вам необходимо добавить в свой магазин. Когда магазин получает действие, промежуточное ПО отправит такое же действие на любые другие вкладки, открытые на вашем сайте.

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

Обмен сообщениями между вкладками осуществляется с помощью Broadcast Channel API. Это функция браузера, которая позволяет вкладкам из одного источника взаимодействовать друг с другом. Вкладки «подписаться» на «каналы». Браузер уведомляет их, когда другая вкладка публикует сообщение на подписанный канал.

Broadcast Channel доступен только в новых браузерах. Redux State Sync использует абстракцию, которая может использовать альтернативные технологии. Если широковещательный канал не поддерживается, вместо него будет использоваться IndexedDB или LocalStorage.

Использование широковещательного канала накладывает некоторые ограничения на то, что вы можете отправлять между вкладками. Данные, которые вы отправляете, должны поддерживаться алгоритмом структурированного клонирования браузера. Сюда входят скалярные значения, массивы, простые объекты JavaScript и большие двоичные объекты. Комплексные значения не будут переданы точно.

Синхронизация вашего магазина

Чтобы начать использовать Redux State Sync, добавьте его в свой проект через npm:

npm install redux-state-sync

Затем создайте базовый магазин. Мы изменим этот код через мгновение, чтобы добавить Redux State Sync.

import {createStore} from "redux";
 
const state = {authenticated: false};
 
const reducer = (state, action) => ({...state, ...action});
 
const store = createStore(reducer, state);

Теперь у нас есть простой магазин. Чтобы синхронизировать его между вкладками, добавьте промежуточное ПО Redux State Sync и настройте прослушиватель сообщений.

import {createStore, applyMiddleware} from "redux";
import {createStateSyncMiddleware, initMessageListener} from "redux-state-sync";
 
const reduxStateSyncConfig = {};
 
const reducer = (state, action) => ({...state, ...action});
 
const store = createStore(
    reducer,
    state,
    applyMiddleware(createStateSyncMiddleware(reduxStateSyncConfig))
);
 
initMessageListener(store);

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

ПО промежуточного слоя для синхронизации состояния создается с помощью служебной функции createStateSyncMiddleware(). Это принимает объект конфигурации, используемый для настройки работы Redux State Sync. Мы рассмотрим это более подробно в следующем разделе.

После создания хранилища оно передается в initMessageListener(). Эта функция обеспечивает настройку перекрестного прослушивания. Без этого вызова вкладки могут не получать новые действия, если при первой загрузке не было отправлено ни одного действия.

Использование initMessageListener() не даст вашей вкладке доступ к существующему хранилищу, хранящемуся на другой вкладке. Когда пользователь открывает новую вкладку, по умолчанию у нее будет собственный магазин свежих данных. Если вы хотите, чтобы новые вкладки получали свое состояние из открытой вкладки, вместо этого используйте функцию initStateWithPrevTab().

const store = createStore(reducer, state, applyMiddleware(createStateSyncMiddleware({})));
initStateWithPrevTab(store);

Состояние магазина будет заменено существующим состоянием, если доступна другая открытая вкладка.

Индивидуальная синхронизация

Redux State Sync поддерживает несколько параметров конфигурации, позволяющих настроить синхронизацию. Вот некоторые из наиболее полезных настроек. Каждый из них задается как свойство в объекте конфигурации, передаваемом в createStateSyncMiddleware().

Исключение действий

Иногда у вас будут действия, которые вы не хотите синхронизировать. Примером может быть действие, вызывающее появление модального диалогового окна. Скорее всего, вы не хотите, чтобы это диалоговое окно отображалось на всех открытых вкладках пользователя!

Вы можете исключить определенные именованные действия, используя параметр черный список. Передайте массив имен действий в качестве значения.

const config = {
    blacklist: ["DEMO_ACTION"]
};
 
// ...
 
// This won't be synced to any other tabs
Store.dispatch({type: "DEMO_ACTION"});

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

Точная фильтрация действий

Если ни черный список, ни белый список не дают вам достаточного контроля, установите параметр predicate. Это принимает функцию, которая используется для фильтрации синхронизируемых действий.

const config = {
    predicate: action => (action.type !== "DEMO_ACTION")
};

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

Настройки канала трансляции

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

Вы можете передать параметры в библиотеку абстракций Broadcast Channel, установив broadcastChannelOption. Это должен быть объект конфигурации, принятый библиотекой pubkey/broadcast-channel.

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

const config = {
    broadcastChannelOption: {type: "idb"}
};

Интеграция с Redux-Persist

Вы часто захотите использовать Redux State Sync в сочетании с Redux Persist. Redux Persist — популярная библиотека, которая автоматически сохраняет ваш магазин Redux в браузере.

При использовании Redux Persist вам не нужно использовать функцию Redux Persist initStateWithPrevTab(). Вместо этого используйте initMessageListener(), поскольку начальным состоянием всегда будет постоянное состояние, предоставляемое Redux Persist.

Занесите действия Redux Persist в черный список в конфигурации Redux State Sync. Их не нужно синхронизировать между вкладками. Вы должны синхронизировать только те изменения, которые действительно влияют на магазин, а не действия, связанные с его жизненным циклом.

const config = {
    blacklist: ["persist/PERSIST", "persist/REHYDRATE"]
};

Краткое содержание

Redux State Sync позволяет синхронизировать действия пользователя на вкладках. Приложения практически безграничны и, вероятно, улучшат работу пользователей. Когда пользователи совершают действия на вашем сайте, они немедленно отражаются на других открытых вкладках.

«Классический» вариант использования — это синхронизация результатов входа и выхода. Однако есть и другие преимущества, такие как доступность входящих уведомлений для всех вкладок или синхронизация настроек на стороне клиента, таких как выбранная пользователем тема пользовательского интерфейса.

Уменьшенная библиотека redux-state-sync весит 19 КБ. С установкой, состоящей всего из нескольких дополнительных строк кода, вам следует рассмотреть возможность добавления Redux State Sync в свой следующий проект. Это позволяет вам связать вкладки вместе в единое целое, вместо того, чтобы они существовали как независимые объекты.




Все права защищены. © Linux-Console.net • 2019-2024