Проблема здесь возникает из-за использования React порталов
Порталы предоставляют первоклассный способ рендеринга дочерних элементов в узел DOM, который существует вне иерархии DOM родительского компонента..
Портал позволяет отображать элементы React под другим DOM none.С упрощениями это будет выглядеть как
const ComponentA = ReactDOM.createPortal(
<CoolComponent />,
document.getElementById('banner'),
)
const ComponentB = ReactDOM.createPortal(
<SuperCoolComponent />,
document.getElementById('footer'),
)
Так что в общем ComponentA
не будет видеть Provider
из ComponentB
.
Вы можете посмотреть на этой странице , однако он не полностью описывает проблему, с которой вы столкнулись.
Если посмотреть на <Modal>
компонентный источник, он использует React.createPortal
для рендеринга и теряет поставщика родителя.
Один обходной путь, который я вижу
- Извлечение
store
из партнерских <Provider/>
Создание нового <Provider>
сразу после <Modal>
использования.
// ModelBody.js
import { Provider, ReactReduxContext } from 'react-redux';
//...
render() {
return (
<ReactReduxContext.Consumer>
{((ctx) => (
<Modal id="addressModal" open={this.props.controlModal} onClose={this.props.action}>
<Provider store={ctx.store}> /* make store available in Portal */
{this.props.addresObj ? (
<Modal.Header>Address Details</Modal.Header>
) : (
<Modal.Header>Insert Address</Modal.Header>
)}
/* other code from Model.js */
</Provider>
</Modal>
)).bind(this) // Dont forget to bind this
}
</ReactReduxContext.Consumer>