Обернуть несколько компонентов React DOM в провайдере redux

У меня есть этот код в моем файле index.js в моем проекте ReactJS, и я хочу, чтобы тег redux <Provider> обернул их так, чтобы все они могли получить доступ к одному и тому же магазину,
. Вопрос в том, как я могу это сделать?

ReactDOM.render(<Header />, document.getElementById('header'));
ReactDOM.render(<App />, document.getElementById('root'));
ReactDOM.render(<Footer />, document.getElementById('footer'));
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 503
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что ж, если store такой же, то вы можете просто применить <Provider> ко всем частям, и все они будут использовать одно и то же хранилище Redux. Provider не обязательно должен быть уникальным, только store. Что-то вроде этого:

const store = createStore(...); // or any valid Redux store declaration or import

ReactDOM.render(<Provider store = {store}><Header /></Provider>, document.getElementById('header'));
ReactDOM.render(<Provider store = {store}><App /></Provider>, document.getElementById('root'));
ReactDOM.render(<Provider store = {store}><Footer /></Provider>, document.getElementById('footer'));

Есть ли причина, по которой вам нужно настроить таргетинг на три элемента HTML? Стандартной практикой здесь было бы просто настроить таргетинг на root и обработать остальное в вашем приложении React, как показано ниже:

В index.js:

const store = createStore(...);
ReactDOM.render(
  <Provider store = {store}>
    <App />
  </Provider>, document.getElementById('root'));

В App.js:

export default = () =>
  <Header />
  <Body />
  <Footer />

Весь ваш HTML-код будет выглядеть так (подход, рекомендованный Facebook создать-реагировать-приложение):

<body>
  <noscript>JavaScript must be enabled to run this application.</noscript>
  <div id = "root"></div>
</body>

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

ReactDOM.render(
  <Provider store = {store}><Header /></Provider>,
  document.getElementById('header')
);
ReactDOM.render(
  <Provider store = {store}><App /></Provider>, 
  document.getElementById('root')
);
ReactDOM.render(
  <Provider store = {store}><Footer /></Provider>,
  document.getElementById('footer')
);

Другой вариант, который не является специфическим для Redux, но также может использоваться с любым приложением React, имеющим несколько корневых компонентов, - использовать порталы для этих компонентов, как показано в этот ответ:

const Page = props => (
  <Provider store = {store}>    
      {ReactDOM.createPortal(<Header/>, document.getElementById('header'))} 
      {ReactDOM.createPortal(<App/>, document.getElementById('root'))} 
      {ReactDOM.createPortal(<Footer/>, document.getElementById('footer'))}
  </Provider>
);

ReactDOM.render(<Page/>, document.getElementById('page'));

Где <div id = "page"></div> - это элемент-заполнитель, который существует в теле HTML для монтирования приложения и не обязательно должен быть родительским для элементов заголовка и т. д.

Эта опция также может использоваться с React context API Provider или компонентом страницы state.

Разве в нем не должно быть заявления return? потому что у меня есть ошибка, говорящая, что Expected an assignment or function call and instead saw an expression в строке, где находится тег поставщика.

Dylan 30.11.2018 13:43

Обратите внимание на скобки для => (...), а не для => {...}. Для скобок требуется return. Скобки используют неявный возврат.

Estus Flask 30.11.2018 14:52

Другие вопросы по теме