97 lines
2.8 KiB
JavaScript
97 lines
2.8 KiB
JavaScript
|
/**
|
||
|
* Copyright 2013-present, Facebook, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var ReactFiberReconciler = require('./ReactFiberReconciler');
|
||
|
|
||
|
var warning = require('fbjs/lib/warning');
|
||
|
|
||
|
function recursivelyAppendChildren(parent, child) {
|
||
|
if (!child) {
|
||
|
return;
|
||
|
}
|
||
|
/* $FlowFixMe: Element should have this property. */
|
||
|
if (child.nodeType === 1) {
|
||
|
/* $FlowFixMe: Refinement issue. I don't know how to express different. */
|
||
|
parent.appendChild(child);
|
||
|
} else {
|
||
|
/* As a result of the refinement issue this type isn't known. */
|
||
|
var node = child;
|
||
|
do {
|
||
|
recursivelyAppendChildren(parent, node.output);
|
||
|
} while (node = node.sibling);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var DOMRenderer = ReactFiberReconciler({
|
||
|
updateContainer: function (container, children) {
|
||
|
container.innerHTML = '';
|
||
|
recursivelyAppendChildren(container, children);
|
||
|
},
|
||
|
createInstance: function (type, props, children) {
|
||
|
var domElement = document.createElement(type);
|
||
|
recursivelyAppendChildren(domElement, children);
|
||
|
if (typeof props.children === 'string') {
|
||
|
domElement.textContent = props.children;
|
||
|
}
|
||
|
return domElement;
|
||
|
},
|
||
|
prepareUpdate: function (domElement, oldProps, newProps, children) {
|
||
|
return true;
|
||
|
},
|
||
|
commitUpdate: function (domElement, oldProps, newProps, children) {
|
||
|
domElement.innerHTML = '';
|
||
|
recursivelyAppendChildren(domElement, children);
|
||
|
if (typeof newProps.children === 'string') {
|
||
|
domElement.textContent = newProps.children;
|
||
|
}
|
||
|
},
|
||
|
deleteInstance: function (instance) {
|
||
|
// Noop
|
||
|
},
|
||
|
|
||
|
|
||
|
scheduleAnimationCallback: window.requestAnimationFrame,
|
||
|
|
||
|
scheduleDeferredCallback: window.requestIdleCallback
|
||
|
|
||
|
});
|
||
|
|
||
|
var warned = false;
|
||
|
|
||
|
function warnAboutUnstableUse() {
|
||
|
process.env.NODE_ENV !== 'production' ? warning(warned, 'You are using React DOM Fiber which is an experimental renderer. ' + 'It is likely to have bugs, breaking changes and is unsupported.') : void 0;
|
||
|
warned = true;
|
||
|
}
|
||
|
|
||
|
var ReactDOM = {
|
||
|
render: function (element, container) {
|
||
|
warnAboutUnstableUse();
|
||
|
if (!container._reactRootContainer) {
|
||
|
container._reactRootContainer = DOMRenderer.mountContainer(element, container);
|
||
|
} else {
|
||
|
DOMRenderer.updateContainer(element, container._reactRootContainer);
|
||
|
}
|
||
|
},
|
||
|
unmountComponentAtNode: function (container) {
|
||
|
warnAboutUnstableUse();
|
||
|
var root = container._reactRootContainer;
|
||
|
if (root) {
|
||
|
// TODO: Is it safe to reset this now or should I wait since this
|
||
|
// unmount could be deferred?
|
||
|
container._reactRootContainer = null;
|
||
|
DOMRenderer.unmountContainer(root);
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
|
||
|
module.exports = ReactDOM;
|