Перейти к основному содержимому
Неофициальный Бета-перевод

Эта страница переведена PageTurner AI (бета). Не одобрена официально проектом. Нашли ошибку? Сообщить о проблеме →

Изоляция подприложений в Redux

Рассмотрим случай «большого» приложения (в компоненте <BigApp>), которое содержит меньшие «подприложения» (в компонентах <SubApp>):

import React, { Component } from 'react'
import SubApp from './subapp'

class BigApp extends Component {
render() {
return (
<div>
<SubApp />
<SubApp />
<SubApp />
</div>
)
}
}

Эти <SubApp> будут полностью независимыми. Они не будут делиться данными или действиями, не будут видеть или взаимодействовать друг с другом.

Лучше не смешивать этот подход со стандартной композицией редюсеров Redux. Для типичных веб-приложений используйте композицию редюсеров. Для «продуктовых хабов», «дашбордов» или корпоративных систем, объединяющих разные инструменты в единый пакет, попробуйте подход с подприложениями.

Подход с подприложениями также полезен для больших команд, разделённых по продуктовым или функциональным направлениям. Такие команды могут поставлять подприложения независимо или в комбинации с общей «оболочкой приложения».

Ниже показан корневой подключённый компонент подприложения. Как обычно, он может отображать дочерние компоненты — подключённые или нет. Обычно мы бы отобразили его в <Provider> и закончили на этом.

class App extends Component { ... }
export default connect(mapStateToProps)(App)

Однако нам не обязательно вызывать ReactDOM.render(<Provider><App /></Provider>), если мы хотим скрыть факт, что компонент подприложения использует Redux.

Возможно, мы захотим запускать несколько экземпляров в одном «большем» приложении, сохраняя их как чёрные ящики, где Redux является деталью реализации.

Чтобы скрыть Redux за React API, можно обернуть его в специальный компонент, инициализирующий хранилище в конструкторе:

import React, { Component } from 'react'
import { Provider } from 'react-redux'
import { createStore } from 'redux'
import reducer from './reducers'
import App from './App'

class SubApp extends Component {
constructor(props) {
super(props)
this.store = createStore(reducer)
}

render() {
return (
<Provider store={this.store}>
<App />
</Provider>
)
}
}

Таким образом каждый экземпляр будет независимым.

Не используйте этот шаблон для частей одного приложения, которые делятся данными. Однако он полезен, когда основное приложение не имеет доступа к внутренностям меньших приложений, и мы хотим скрыть факт их реализации на Redux. Каждый экземпляр компонента будет иметь собственное хранилище, поэтому они не будут «знать» о существовании друг друга.