Несколько реагирующих приложений на одной странице и их синхронизация

У меня есть страница электронной коммерции. Вся страница не заключена в одно приложение для реагирования.

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

  • Приложение корзины. (Показывает количество, представляющее количество товаров в корзине)
  • Приложение со списком продуктов. Приложение со списком продуктов отображает список продуктов.

У каждого товара есть кнопка Добавить в корзину. Когда пользователь нажимает на нее, нам нужно немедленно обновить количество в корзине, не обновляя страницу.

Теперь вопрос, который у меня есть, заключается в том, есть ли способ добиться этого без рендеринга всей страницы в ответ. Ниже приведена грубая HTML-разметка, которая у меня есть.

<navbar>
    <navbar-links/>
    <div id="site-cart-app"></div> // this is where the cart react app is initialized.
</navbar>
<div id="product-list-app"></div> // this is where the product list app is initialized.

person NiK    schedule 19.11.2019    source источник
comment
Возможно, это изменилось, но несколько приложений на одной странице, вызывающих хуки, могут отклоняться с некоторыми ошибками.   -  person imrok    schedule 19.11.2020


Ответы (3)


Резюме высокого уровня. Чтобы синхронизировать несколько приложений React на одной странице, вам нужен общий источник данных, например REDUX (я лично рекомендую) и subscribe с REDUX Store в нескольких приложениях React, и соответствующим образом обновите компонент.

Как добиться? (Что я сделал со своим проектом)

  1. Создайте 2 отдельных приложения react-redux.
  2. Сделайте общий магазин и код пакета и запустите.

Это кажется простым, но это не так.

Проблема, с которой я столкнулся во время внедрения.

Как разделить проекты React с помощью общего Redux Store и редюсеров. - Для этого я использовал библиотеку Redux-Dynamic-Modules, которая позволяет сделать отдельный хранить или загружать редукторы при загрузке компонента.

Я все еще работаю над этим, но для вашего реф. Вот мой репозиторий git для аналогичной проблемы.

person Sunil Kashyap    schedule 19.11.2019

Вы можете решить эти несколько способов,

В одном из них вы добавляете службу, в которой вы пишете запрос кода для добавления или удаления элемента карты и используете пример темы Rxjs и подписки из компонента карты здесь.

В ваших Services.js

import { Observable, Subject } from "rxjs";
export class CardService {
   public static observable = new Subject();
}

На странице продукта

import { CardService  } from ./services/CardService";

//trigger when click to add or remove Card item 
TollAdminService.observable.next({ cardItem, action });

И в компоненте карты

import { CardService  } from ./services/CardService";

// inside the component constructor like this
constructor(props) {
    TollAdminService.observable.subscribe((cardItem: any, action: any) => {
      //add your action code here...
    }
}

Может быть, это поможет вам решить вашу проблему

Спасибо

person Md. Abu Sayed    schedule 19.11.2019

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

person Nouman Janjua    schedule 19.11.2019
comment
есть ли онлайн-справка или пример, который я могу изучить? - person NiK; 19.11.2019
comment
Посмотрите на этот redux.js.org/recipes/isolation-redux-sub-apps - person Nouman Janjua; 19.11.2019