Как подключить хранилище Redux к динамически создаваемым компонентам вне root?

#javascript #reactjs #react-dom

#javascript #reactjs #реагировать-dom

Вопрос:

Я работаю над панелью администратора переднего плана. Это позволяет редактировать каждый элемент / виджет на сайте.

Есть панель администратора, которая подключена к Redux и из которой вы можете активировать edition. Когда вы нажимаете на кнопку edit, появляются кнопки render EditModeButton, которые добавляются к каждому div / виджету, который имеет CSS-класс button-edit-quick-normal на странице. Пожалуйста, смотрите код ниже.

 enableEditMode = () => {

    //Catch all of div/widget with class .button-edit-quick-normal
    let buttonEditQuickNormal = [...document.querySelectorAll('.button-edit-quick-normal')];

    //loop through array of DOM elements and render new react component
    buttonEditQuickNormal.map(domContainer => {
        ReactDOM.render(<EditModeButton
            menuType={'quick-normal'}
            handleSingleMenuActivated={this.handleSingleMenuActivated}
            singleMenuActivated={this.state.singleMenuActivated}
        />, domContainer);
    });
 }
  

Мой провайдер выглядит следующим образом:

 import { BrowserRouter, Route, Link, Switch } from 'react-router-dom';
// import ThemeApp from 'SBAppsThemes/ThemeApp';
import { SiteEditorPortal } from './index_sitebuilder';
import { AdminbarPortal } from './index_adminbar';


const store = createStore(AppReducer, compose(applyMiddleware(thunk), window.devToolsExtension ? window.devToolsExtension() : f => f));

       ReactDOM.render(
         <Provider store={store}>
            <React.Fragment>
                <AdminbarPortal />
                <SiteEditorPortal />
            </React.Fragment>
        </Provider>,
        document.getElementById('root-react-portals'));
  

А вот панель администратора и идентификатор SITEEID, которые защищают ReactDOM.render:

 import SiteEditor from 'SBAppsBuilder/containers/SiteEditor';
import ReactDOM from 'react-dom';
import Root from 'SiteBuilder/boot/root';

export const SiteEditorPortal = () => ReactDOM.createPortal(<SiteEditor/>, document.getElementById('root-sitebuilder'))
  

.

 import React from 'react';
import ReactDOM from 'react-dom';
import Adminbar from 'SBAppsAdminbar/Adminbar';


export const AdminbarPortal = () => ReactDOM.createPortal(<Adminbar />, document.getElementById('root'))
  

Мой вопрос в том, как добавить динамически созданные компоненты в хранилище redux?

ps. Я уже подключался к отдельному компоненту ReactDOM.render через порталы React, но в этом случае они создаются динамически.

Комментарии:

1. Где ваш провайдер?

2. @h1b9b Я просто добавляю, как выглядит Provider и как я создал портал для двух компонентов.

3. @h1b9b есть идеи

4. на самом деле, я не понимаю вопроса, вы хотите добавить компонент в свое хранилище redux? значит, это не просто отправить компонент в действие и сохранить его с помощью reducer?

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