Доступ к приложению React из другого приложения React на той же странице
У меня есть ситуация, когда я написал интерфейс моего сайта как микро-сервисы. Каждый функциональный раздел моего сайта - это приложение типа "реагирующая среда", связанное с css и html. Я сделал это, чтобы я мог повторно использовать эти разделы где угодно на сайте.
Моя проблема, однако, в области оформления заказа, мне нужно передать customerId из приложения входа в систему (при успешном ответе) в приложение адреса доставки, чтобы я мог вернуть адрес по умолчанию. Я не хочу создавать новое приложение и дублировать код для приложений с адресами входа и доставки, потому что мне нужно будет использовать их в другом месте на веб-сайте.
Итак, мой вопрос. Как я могу передать этот customerId из моего приложения для входа в приложение для адреса доставки без перезагрузки страницы? Есть ли способ получить доступ к методу реагирующего приложения извне этого реагирующего приложения?
Обработчик кликов для входа в систему:
clickHandler(e) {
e.preventDefault();
let payload = {"email":this.props.email, "password":this.props.password};
AuthenticationApp.login(payload).then((response) => {
if (this.props.referrer === "checkout") {
$("#checkout_login-register-tab").addClass("done");
$("#checkout_login-delivery-tab").removeClass("todo");
// Temporary hack to reload page until we can pass new user session into delivery/billing react app from here.
location.reload();
}
this.props.updateParentState({isLoggedIn: true});
})
.catch(function(response){
console.log("res2 - catch", response)
});
}
Я заставил страницу перезагрузить страницу, поэтому приложение адреса доставки перерисовывает и забирает customerId из сервиса. Мне нужен способ повторного рендеринга приложения доставки на этом этапе (из этого отдельного приложения), либо с помощью какого-либо доступа к функции, либо с помощью принудительного сброса приложения? Возможно ли это или есть обходной путь, отличный от перезагрузки страницы?
2 ответа
Вы можете сделать что-то вроде этого:
loadDeliveryApp(data) {
ReactDOM.render(<DeliveryApp data={data} />, document.getElementById('delivery-app'))
ReactDOM.unmountComponentAtNode(document.getElementById("login-app"))
}
clickHandler(e) {
e.preventDefault()
// your login stuff
loadDeliveryApp(data)
}
Вот рабочая демка.
Я - первый создатель React Habitat... все ваши приложения могут общаться друг с другом через наблюдателя потока или что-то вроде приставки.
Я предлагаю поток для реакции среды обитания, как правило, так как отдельные магазины сохраняют его легким, а не один БОЛЬШОЙ магазин в избыточном, где у вас может быть мертвый код в среде обитания.
Вам нужно будет создать одно общее хранилище, которое будут импортировать оба ваших приложения, так что если одно из них изменит его, другое получит обновление. Я могу собрать демо позже, если это поможет.