UNPKG

react-redux

Version:

Official React bindings for Redux

50 lines (41 loc) 1.43 kB
import React, { useMemo } from 'react' import PropTypes from 'prop-types' import { ReactReduxContext } from './Context' import Subscription from '../utils/Subscription' import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect' function Provider({ store, context, children }) { const contextValue = useMemo(() => { const subscription = new Subscription(store) subscription.onStateChange = subscription.notifyNestedSubs return { store, subscription, } }, [store]) const previousState = useMemo(() => store.getState(), [store]) useIsomorphicLayoutEffect(() => { const { subscription } = contextValue subscription.trySubscribe() if (previousState !== store.getState()) { subscription.notifyNestedSubs() } return () => { subscription.tryUnsubscribe() subscription.onStateChange = null } }, [contextValue, previousState]) const Context = context || ReactReduxContext return <Context.Provider value={contextValue}>{children}</Context.Provider> } if (process.env.NODE_ENV !== 'production') { Provider.propTypes = { store: PropTypes.shape({ subscribe: PropTypes.func.isRequired, dispatch: PropTypes.func.isRequired, getState: PropTypes.func.isRequired, }), context: PropTypes.object, children: PropTypes.any, } } export default Provider