mirror of
https://github.com/infeng/react-viewer.git
synced 2025-12-08 17:36:40 +00:00
97 lines
2.2 KiB
TypeScript
97 lines
2.2 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 defaultContainer: HTMLElement;
|
|
private container: HTMLElement;
|
|
private component: React.ReactNode;
|
|
|
|
constructor() {
|
|
super();
|
|
|
|
this.container = null;
|
|
this.defaultContainer = null;
|
|
if (typeof document !== 'undefined') {
|
|
this.setDefaultContainer();
|
|
}
|
|
this.component = null;
|
|
}
|
|
|
|
setDefaultContainer() {
|
|
this.defaultContainer = document.createElement('div');
|
|
}
|
|
|
|
renderViewer() {
|
|
if (this.props.visible || this.component) {
|
|
if (!this.container) {
|
|
if (this.props.container) {
|
|
this.container = this.props.container;
|
|
} else {
|
|
if (!this.defaultContainer) {
|
|
this.setDefaultContainer();
|
|
}
|
|
this.container = this.defaultContainer;
|
|
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.props.onClose();
|
|
}
|
|
this.removeViewer();
|
|
}
|
|
|
|
componentWillReceiveProps(nextProps: ViewerProps) {
|
|
if (this.props.container !== nextProps.container) {
|
|
this.component = null;
|
|
if (nextProps.container) {
|
|
if (this.container) {
|
|
document.body.removeChild(this.container);
|
|
}
|
|
this.container = nextProps.container;
|
|
} else {
|
|
this.container = this.defaultContainer;
|
|
document.body.appendChild(this.container);
|
|
}
|
|
}
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.renderViewer();
|
|
}
|
|
|
|
componentDidUpdate() {
|
|
this.renderViewer();
|
|
}
|
|
|
|
render() {
|
|
return null;
|
|
}
|
|
}
|