react-viewer/src/Viewer.tsx
2016-10-21 13:55:26 +08:00

72 lines
1.5 KiB
TypeScript

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import ViewerCore from './ViewerCore';
import ViewerProps from './ViewerProps';
export default class Viewer extends React.Component<ViewerProps, any> {
private container: HTMLElement;
private component: React.ReactNode;
constructor() {
super();
this.container = null;
this.component = null;
}
renderViewer() {
if (this.props.visible || this.component) {
if (!this.container) {
if (this.props.container) {
this.container = this.props.container;
}else {
this.container = document.createElement('div');
document.body.appendChild(this.container);
}
}
let instance = this;
ReactDOM.unstable_renderSubtreeIntoContainer(
this,
<ViewerCore
{...this.props}
/>,
this.container,
function () {
instance.component = this;
},
);
}
}
removeViewer() {
if (this.container) {
const container = this.container;
ReactDOM.unmountComponentAtNode(container);
container.parentNode.removeChild(container);
this.container = null;
this.component = null;
}
}
componentWillUnmount() {
if (this.props.visible) {
this.props.onClose();
this.removeViewer();
} else {
this.removeViewer();
}
}
componentDidMount() {
this.renderViewer();
}
componentDidUpdate() {
this.renderViewer();
}
render() {
return null;
}
}