diff --git a/README.md b/README.md index 08f03d1f..e109c2db 100644 --- a/README.md +++ b/README.md @@ -203,6 +203,12 @@ ReactDOM.render( specific the close icon. + + forceRender + Boolean + false + Create dialog dom node before dialog first show + diff --git a/examples/ant-design.tsx b/examples/ant-design.tsx index ed519326..1b4ba5fe 100644 --- a/examples/ant-design.tsx +++ b/examples/ant-design.tsx @@ -36,6 +36,7 @@ class MyControl extends React.Component { center: false, mousePosition: {}, useIcon: false, + forceRender: false, }; onClick = e => { @@ -49,7 +50,6 @@ class MyControl extends React.Component { } onClose = e => { - // console.log(e); this.setState({ visible: false, }); @@ -61,6 +61,12 @@ class MyControl extends React.Component { }); } + onForceRenderChange = e => { + this.setState({ + forceRender: e.target.checked, + }); + } + changeWidth = () => { this.setState({ width: this.state.width === 600 ? 800 : 600, @@ -98,6 +104,7 @@ class MyControl extends React.Component { mousePosition={this.state.mousePosition} destroyOnClose={this.state.destroyOnClose} closeIcon={this.state.useIcon ? getSvg(clearPath, {}, true) : undefined} + forceRender={this.state.forceRender} >

basic modal

@@ -141,6 +148,15 @@ class MyControl extends React.Component { onChange={this.center} /> +   +

{dialog} diff --git a/package.json b/package.json index 372225fb..9b870c55 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rc-dialog", - "version": "7.2.1", + "version": "7.2.2", "description": "dialog ui component for react", "keywords": [ "react", diff --git a/src/Dialog.tsx b/src/Dialog.tsx index c298e60a..b244afbf 100644 --- a/src/Dialog.tsx +++ b/src/Dialog.tsx @@ -75,6 +75,10 @@ export default class Dialog extends React.Component { } componentDidMount() { this.componentDidUpdate({}); + // if forceRender is true, set element style display to be none; + if (this.props.forceRender && this.wrap) { + this.wrap.style.display = 'none'; + } } componentDidUpdate(prevProps: IDialogPropTypes) { const props = this.props; @@ -207,7 +211,7 @@ export default class Dialog extends React.Component { ); } - const style = { ... props.style, ...dest }; + const style = { ...props.style, ...dest }; const sentinelStyle = { width: 0, height: 0, overflow: 'hidden' }; const transitionName = this.getTransitionName(); const dialogElement = ( @@ -261,7 +265,7 @@ export default class Dialog extends React.Component { } return style; } - getWrapStyle = () : any => { + getWrapStyle = (): any => { return { ...this.getZIndexStyle(), ...this.props.wrapStyle }; } getMaskStyle = () => { diff --git a/src/DialogWrap.tsx b/src/DialogWrap.tsx index 64b41f2c..65b06f9f 100644 --- a/src/DialogWrap.tsx +++ b/src/DialogWrap.tsx @@ -8,8 +8,9 @@ import IDialogPropTypes from './IDialogPropTypes'; const IS_REACT_16 = 'createPortal' in ReactDOM; class DialogWrap extends React.Component { - static defaultProps = { + static defaultProps = { visible: false, + forceRender: false, }; _component: React.ReactElement; @@ -18,8 +19,8 @@ class DialogWrap extends React.Component { removeContainer: () => void; - shouldComponentUpdate({ visible }: { visible: boolean }) { - return !!(this.props.visible || visible); + shouldComponentUpdate({ visible, forceRender }: { visible: boolean, forceRender: boolean }) { + return !!(this.props.visible || visible) || (this.props.forceRender || forceRender); } componentWillUnmount() { @@ -40,7 +41,7 @@ class DialogWrap extends React.Component { saveDialog = (node: any) => { this._component = node; - } + } getComponent = (extra = {}) => { return ( @@ -71,7 +72,7 @@ class DialogWrap extends React.Component { } render() { - const { visible } = this.props; + const { visible, forceRender } = this.props; let portal: any = null; @@ -83,6 +84,7 @@ class DialogWrap extends React.Component { autoDestroy={false} getComponent={this.getComponent} getContainer={this.getContainer} + forceRender={forceRender} > {({ renderComponent, removeContainer }: { renderComponent: any, removeContainer: any }) => { this.renderComponent = renderComponent; @@ -93,7 +95,7 @@ class DialogWrap extends React.Component { ); } - if (visible || this._component) { + if (visible || forceRender || this._component) { portal = ( {this.getComponent()} diff --git a/src/IDialogPropTypes.tsx b/src/IDialogPropTypes.tsx index aa999ae9..f73a20c1 100644 --- a/src/IDialogPropTypes.tsx +++ b/src/IDialogPropTypes.tsx @@ -35,6 +35,7 @@ interface IDialogPropTypes { wrapProps?: any; getContainer?: () => HTMLElement; closeIcon?: ReactNode; + forceRender?: boolean; } export default IDialogPropTypes; diff --git a/tests/index.js b/tests/index.js index ce569bf8..fc79cfe2 100644 --- a/tests/index.js +++ b/tests/index.js @@ -267,4 +267,15 @@ describe('dialog', () => { ), container); expect($('.rc-dialog').css('transform-origin')).to.not.be.empty(); }); + + it('can get dom element before dialog first show when forceRender is set true ',()=>{ + const d = ReactDOM.render(( + +
forceRender element
+
+ ),container) + expect($('.rc-dialog-body > div').text()).to.be('forceRender element') + }) });