From 4fb199b6356b9015f5768f54c71272767543856b Mon Sep 17 00:00:00 2001 From: mark Date: Tue, 6 Dec 2016 12:36:00 +0000 Subject: [PATCH] Support multiple children, expose gateway registry --- src/Gateway.js | 4 ++-- src/GatewayDest.js | 2 +- src/GatewayRegistry.js | 19 +++++++------------ src/index.js | 1 + 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/src/Gateway.js b/src/Gateway.js index c4b7bb0..7bc5cec 100644 --- a/src/Gateway.js +++ b/src/Gateway.js @@ -24,12 +24,12 @@ export default class Gateway extends React.Component { } componentWillReceiveProps(props) { - this.gatewayRegistry.clearChild(this.props.into); + this.gatewayRegistry.clearChild(this.props.into, this.props.children); this.renderIntoGatewayNode(props); } componentWillUnmount() { - this.gatewayRegistry.removeChild(this.props.into); + this.gatewayRegistry.removeChild(this.props.into, this.props.children); } renderIntoGatewayNode(props) { diff --git a/src/GatewayDest.js b/src/GatewayDest.js index 3107032..2d23cfc 100644 --- a/src/GatewayDest.js +++ b/src/GatewayDest.js @@ -36,6 +36,6 @@ export default class GatewayDest extends React.Component { render() { const { component, tagName, ...attrs } = this.props; delete attrs.name; - return React.createElement(component || tagName || 'div', attrs, this.state.child); + return React.createElement(component || tagName || 'div', attrs, this.state.children); } } diff --git a/src/GatewayRegistry.js b/src/GatewayRegistry.js index 09e72e2..fe71113 100644 --- a/src/GatewayRegistry.js +++ b/src/GatewayRegistry.js @@ -10,7 +10,7 @@ export default class GatewayRegistry { } this._containers[name].setState({ - child: this._children[name] + children: this._children[name] }); } @@ -24,22 +24,17 @@ export default class GatewayRegistry { } addChild(name, child) { - if (this._children[name]) { - console.warn( - 'Only a single Gateway can be rendered at a time into a GatewayDest.' + - `You rendered multiple into "${name}"` - ); - } - this._children[name] = child; + this._children[name] = this._children[name] || []; + this._children[name].push(child); this._renderContainer(name); } - clearChild(name) { - this._children[name] = null; + clearChild(name, child) { + this._children[name] = this._children[name].filter(item => item !== child); } - removeChild(name) { - this.clearChild(name); + removeChild(name, child) { + this.clearChild(name, child); this._renderContainer(name); } } diff --git a/src/index.js b/src/index.js index 6637f87..dc87c0e 100644 --- a/src/index.js +++ b/src/index.js @@ -1,3 +1,4 @@ export Gateway from './Gateway'; export GatewayDest from './GatewayDest'; export GatewayProvider from './GatewayProvider'; +export GatewayRegistry from './GatewayRegistry';