#javascript #reactjs #redux #react-redux
#javascript #reactjs #redux #react-redux
Вопрос:
У меня есть одно хранилище, которое управляет состоянием для двух компонентов A
и B
.
Я оборачиваю каждый из компонентов в такого поставщика, и они отображаются с помощью инструментов sdk от моей компании, которые я не могу изменить, поэтому я использую двух поставщиков:
A.js
import { store } from './store';
<Provider store={store}>
<A />
</Provider>
B.js
import { store } from './store';
<Provider store={store}>
<B />
</Provider>
store.js
export const store = createStore(combineReducers(mainReducer, AReducer, BReducer));
Я настроил действие для отправки другого действия, обрабатываемого B
‘s reducer, чтобы эти два компонента могли совместно использовать состояние. Однако, когда я выполняю действие в A
компоненте, редуктор работает нормально A
, но он не запускается B
. Есть ли способ заставить это работать, используя два родственных компонента поставщика?
Комментарии:
1. Идея управления состоянием Redux заключается в том, чтобы иметь единый источник достоверности, который является хранилищем, для всего приложения; почему вы используете двух разных поставщиков для двух разных компонентов, а не одного поставщика для всего приложения?
2. Каким будет вариант использования для двух поставщиков? Если оба поддерева имеют одинаковое состояние приложения, я не вижу причин не помещать их в один и тот же поставщик.
3. Я забыл упомянуть, что я ограничен использованием двух поставщиков, поскольку я визуализирую эти компоненты с помощью инструментов sdk от моей компании.
Ответ №1:
Структура приложения react-redux должна иметь основной App.js где вы обрабатываете маршрутизацию, загрузку компонентов и т.д. Затем в вашем index.js вы импортируете и визуализируете приложение.
Если вы будете следовать этой структуре, то все, что вам нужно сделать, это обернуть приложение поставщиком redux. Ваш index.js тогда это выглядело бы примерно следующим образом:
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import { Provider } from "react-redux";
import store from "./redux/store";
ReactDOM.render(
<Provider store={store()}>
<App />
</Provider>, document.getElementById('root'));
serviceWorker.unregister();
Теперь все, что осталось, это импортировать ваши компоненты в App.js и используйте их по мере необходимости.
Редактировать: это возможно, но я все еще думаю, что вы запутались в том, как настроить импорт ваших компонентов в одном приложении. В любом случае, вы можете попробовать следующий подход:
import React from "react";
import "./styles.css";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import Component1 from "./component1";
import Component2 from "./component2";
import store from "./redux/store";
ReactDOM.render(
[
<Provider store={store} key="1">
<Component1 />
</Provider>,
<Provider store={store} key="2">
<Component2 />
</Provider>
],
document.getElementById("root")
);
Вы можете найти рабочую изолированную среду кода здесь codesanbox
Комментарии:
1. @dylanpark Я обновил свой ответ рабочим примером двух поставщиков. Я надеюсь, что это то, что вы хотели.