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((
+
+ ),container)
+ expect($('.rc-dialog-body > div').text()).to.be('forceRender element')
+ })
});