avg-core-ts
Version:
Develop Adventure Game (or ADV, Visual Novel, Galgame, etc.) on your own!
72 lines (60 loc) • 1.9 kB
JSX
/**
* @file Surface component
* @author MicroMatrix <yangpan.1985@bytedance.com>
* @copyright 2012-2020 bytedance
* @link git@code.byted.org:yangpan.1985/avg.git
*/
import React from 'react';
import PropTypes from 'prop-types';
import ReactUpdates from 'react-dom/lib/ReactUpdates';
import ReactInstanceMap from 'react-dom/lib/ReactInstanceMap';
import ContainerMixin from 'components/ContainerMixin';
import core from 'core/core';
/**
* Surface is a standard React component and acts as the main drawing canvas.
* ReactCanvas components cannot be rendered outside a Surface.
*/
export class Surface extends React.PureComponent {
// mixins: [ContainerMixin],
static propTypes = {
children: PropTypes.any
};
constructor(props) {
super(props);
Object.assign(this, ContainerMixin);
}
componentDidMount() {
this.node = core.getStage();
// This is the integration point between custom canvas components and React
const transaction = ReactUpdates.ReactReconcileTransaction.getPooled();
transaction.perform(
this.mountAndInjectChildren,
this,
this.props.children,
transaction,
ReactInstanceMap.get(this)._context
);
ReactUpdates.ReactReconcileTransaction.release(transaction);
}
componentDidUpdate() {
// We have to manually apply child reconciliation since child are not
const transaction = ReactUpdates.ReactReconcileTransaction.getPooled();
transaction.perform(
this.updateChildren,
this,
this.props.children,
transaction,
ReactInstanceMap.get(this)._context
);
ReactUpdates.ReactReconcileTransaction.release(transaction);
}
componentWillUnmount() {
// Implemented in ReactMultiChild.Mixin
this.unmountChildren();
this.node.removeChildren();
}
render() {
return null;
}
}
// module.exports = Surface;