Provider
Overview
Компонент <Provider>
делает store
Redux доступным для любых вложенных компонентов, которым необходим доступ к хранилищу Redux.
Поскольку любой компонент React в приложении React Redux может быть подключен к хранилищу, большинство приложений будут рендерить <Provider>
на верхнем уровне со всем деревом компонентов приложения внутри него.
Хуки и connect
после подключения смогут получить доступ к предоставленному экземпляру хранилища через механизм передачи контекста из React.
Пропсы
interface ProviderProps<A extends Action = AnyAction, S = any> {
/**
* Единственное хранилище Redux в вашем приложении.
*/
store: Store<S, A>
/**
* (Опционально) снэпшот серверного состояния. Будет использован во время изначального рендеринга при гидрации(hydration)
* Если доступно, то убедится, что вывод пользовательского интерфейса соответствует HTML-коду, сгенерированному на сервере.
* Новый в 8.0
*/
serverState?: S
/**
* (Опционально) контекст, который будет внутренне использован в react-redux.
* Функция React.createContext() отвечает за создание контекста для использования.
* Если этот пропс используется, вам понадобится изменить `connect`
* путём предоставления того же контекста, что был передан в Provider.
* Изначальное значение не важно, т.к. оно перезаписывается внутренним состоянием Provider.
*/
context?: Context<ReactReduxContextValue<S, A>>
/** Верхнеуровеневый элемент React в вашем дереве компонентов, такие как `<App />` **/
children: ReactNode
}
Как правило, вам нужно только передать <Provider store={store}>.
Вы можете предоставить экземпляр контекста. Если вы это сделаете, вам также нужно будет предоставить один и тот же экземпляр контекста всем вашим подключенным компонентам. Невозможность предоставить правильный контекст приводит к ошибке во время исполнения:
Invariant Violation
Could not find "store" in the context of "Connect(MyComponent)". Either wrap the root component in a
<Provider>
, or pass a custom React context provider to<Provider>
and the corresponding React context consumer to Connect(Todo) in connect options.
Использование React 18 SSR
Начиная с React-Redux v8, <Provider>
теперь принимает свойство serverState
для использования в сценариях гидратации SSR. Это необходимо, если вы вызываете hydrateRoot, чтобы избежать несоответствия при гидратации.
Вы должны передать целиком сериализованное состояние с сервера в качестве свойства serverState
, и React будет использовать это состояние для начального рендеринга гидратации. После этого он применит все изменения, которые произошли на клиенте в процессе загрузки.
Примеры
Базовое использование
В приведенном ниже примере компонент <App />
является компонентом корневого уровня. Это означает, что он находится на самом верху нашей иерархии компонентов.
import React from 'react'
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import { App } from './App'
import createStore from './createReduxStore'
const store = createStore()
// Начиная с React 18
const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(
<Provider store={store}>
<App />
</Provider>
)
React 18 SSR гидрация(Hydration)
В этом примере клиент получил HTML, отображаемый сервером, а также сериализованное состояние Redux, прикрепленное к window
. Сериализованное состояние используется для предварительного заполнения содержимого хранилища и для передачи в качестве свойства serverState
в <Provider>
import { hydrateRoot } from 'react-dom/client'
import { configureStore } from '@reduxjs/toolkit'
import { Provider } from 'react-redux'
const preloadedState = window.__PRELOADED_STATE__
const clientStore = configureStore({
reducer: rootReducer,
preloadedState,
})
hydrateRoot(
document.getElementById('root'),
<Provider store={clientStore} serverState={preloadedState}>
<App />
</Provider>
)