react 0.6.3 → 0.9.0-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -222
- package/addons.js +1 -0
- package/lib/AutoFocusMixin.js +30 -0
- package/lib/CSSCore.js +115 -0
- package/lib/CSSProperty.js +121 -0
- package/lib/CSSPropertyOperations.js +97 -0
- package/lib/ChangeEventPlugin.js +387 -0
- package/lib/ClientReactRootIndex.js +30 -0
- package/lib/CompositionEventPlugin.js +260 -0
- package/lib/DOMChildrenOperations.js +165 -0
- package/lib/DOMProperty.js +268 -0
- package/lib/DOMPropertyOperations.js +181 -0
- package/lib/Danger.js +187 -0
- package/lib/DefaultDOMPropertyConfig.js +197 -0
- package/lib/DefaultEventPluginOrder.js +44 -0
- package/lib/EnterLeaveEventPlugin.js +145 -0
- package/lib/EventConstants.js +76 -0
- package/lib/EventListener.js +69 -0
- package/lib/EventPluginHub.js +291 -0
- package/lib/EventPluginRegistry.js +260 -0
- package/lib/EventPluginUtils.js +214 -0
- package/lib/EventPropagators.js +143 -0
- package/lib/ExecutionEnvironment.js +44 -0
- package/lib/LinkedStateMixin.js +46 -0
- package/lib/LinkedValueUtils.js +161 -0
- package/lib/MobileSafariClickEventPlugin.js +63 -0
- package/lib/PooledClass.js +119 -0
- package/lib/React.js +95 -0
- package/lib/ReactCSSTransitionGroup.js +65 -0
- package/lib/ReactCSSTransitionGroupChild.js +138 -0
- package/lib/ReactChildren.js +132 -0
- package/lib/ReactComponent.js +550 -0
- package/lib/ReactComponentBrowserEnvironment.js +158 -0
- package/lib/ReactComponentEnvironment.js +26 -0
- package/lib/ReactCompositeComponent.js +1455 -0
- package/lib/ReactContext.js +67 -0
- package/lib/ReactCurrentOwner.js +39 -0
- package/lib/ReactDOM.js +207 -0
- package/lib/ReactDOMButton.js +68 -0
- package/lib/ReactDOMComponent.js +399 -0
- package/lib/ReactDOMForm.js +59 -0
- package/lib/ReactDOMIDOperations.js +218 -0
- package/lib/ReactDOMImg.js +58 -0
- package/lib/ReactDOMInput.js +181 -0
- package/lib/ReactDOMOption.js +51 -0
- package/lib/ReactDOMSelect.js +179 -0
- package/lib/ReactDOMSelection.js +189 -0
- package/lib/ReactDOMTextarea.js +140 -0
- package/lib/ReactDefaultBatchingStrategy.js +75 -0
- package/lib/ReactDefaultInjection.js +115 -0
- package/lib/ReactDefaultPerf.js +244 -0
- package/lib/ReactDefaultPerfAnalysis.js +199 -0
- package/lib/ReactErrorUtils.js +37 -0
- package/lib/ReactEventEmitter.js +337 -0
- package/lib/ReactEventEmitterMixin.js +57 -0
- package/lib/ReactEventTopLevelCallback.js +109 -0
- package/lib/ReactInjection.js +39 -0
- package/lib/ReactInputSelection.js +140 -0
- package/lib/ReactInstanceHandles.js +338 -0
- package/lib/ReactLink.js +54 -0
- package/lib/ReactMarkupChecksum.js +53 -0
- package/lib/ReactMount.js +641 -0
- package/lib/ReactMountReady.js +95 -0
- package/lib/ReactMultiChild.js +425 -0
- package/lib/ReactMultiChildUpdateTypes.js +38 -0
- package/lib/ReactOwner.js +154 -0
- package/lib/ReactPerf.js +85 -0
- package/lib/ReactPropTransferer.js +147 -0
- package/lib/ReactPropTypeLocationNames.js +31 -0
- package/lib/ReactPropTypeLocations.js +29 -0
- package/lib/ReactPropTypes.js +359 -0
- package/lib/ReactPutListenerQueue.js +61 -0
- package/lib/ReactReconcileTransaction.js +181 -0
- package/lib/ReactRootIndex.js +36 -0
- package/lib/ReactServerRendering.js +59 -0
- package/lib/ReactStateSetters.js +111 -0
- package/lib/ReactTextComponent.js +99 -0
- package/lib/ReactTransitionChildMapping.js +106 -0
- package/lib/ReactTransitionEvents.js +97 -0
- package/lib/ReactTransitionGroup.js +187 -0
- package/lib/ReactUpdates.js +148 -0
- package/lib/ReactWithAddons.js +46 -0
- package/lib/SelectEventPlugin.js +200 -0
- package/lib/ServerReactRootIndex.js +36 -0
- package/lib/SimpleEventPlugin.js +413 -0
- package/lib/SyntheticClipboardEvent.js +51 -0
- package/lib/SyntheticCompositionEvent.js +51 -0
- package/lib/SyntheticDragEvent.js +44 -0
- package/lib/SyntheticEvent.js +164 -0
- package/lib/SyntheticFocusEvent.js +44 -0
- package/lib/SyntheticKeyboardEvent.js +58 -0
- package/lib/SyntheticMouseEvent.js +85 -0
- package/lib/SyntheticTouchEvent.js +50 -0
- package/lib/SyntheticUIEvent.js +45 -0
- package/lib/SyntheticWheelEvent.js +66 -0
- package/lib/Transaction.js +276 -0
- package/lib/ViewportMetrics.js +37 -0
- package/lib/accumulate.js +54 -0
- package/lib/adler32.js +39 -0
- package/lib/cloneWithProps.js +59 -0
- package/lib/containsNode.js +49 -0
- package/lib/copyProperties.js +54 -0
- package/lib/createArrayFrom.js +91 -0
- package/lib/createFullPageComponent.js +63 -0
- package/lib/createNodesFromMarkup.js +93 -0
- package/lib/createObjectFrom.js +61 -0
- package/lib/cx.js +44 -0
- package/lib/dangerousStyleValue.js +57 -0
- package/lib/emptyFunction.js +43 -0
- package/lib/escapeTextForBrowser.js +47 -0
- package/lib/flattenChildren.js +57 -0
- package/lib/forEachAccumulated.js +36 -0
- package/lib/getActiveElement.js +34 -0
- package/lib/getEventKey.js +85 -0
- package/lib/getEventTarget.js +36 -0
- package/lib/getMarkupWrap.js +118 -0
- package/lib/getNodeForCharacterOffset.js +80 -0
- package/lib/getReactRootElementInContainer.js +40 -0
- package/lib/getTextContentAccessor.js +42 -0
- package/lib/getUnboundedScrollPosition.js +45 -0
- package/lib/hyphenate.js +35 -0
- package/lib/invariant.js +62 -0
- package/lib/isEventSupported.js +70 -0
- package/lib/isNode.js +33 -0
- package/lib/isTextInputElement.js +49 -0
- package/lib/isTextNode.js +30 -0
- package/lib/joinClasses.js +44 -0
- package/lib/keyMirror.js +58 -0
- package/lib/keyOf.js +41 -0
- package/lib/memoizeStringOnly.js +39 -0
- package/lib/merge.js +37 -0
- package/lib/mergeHelpers.js +136 -0
- package/lib/mergeInto.js +45 -0
- package/lib/mixInto.js +34 -0
- package/lib/objMap.js +47 -0
- package/lib/objMapKeyVal.js +47 -0
- package/lib/onlyChild.js +43 -0
- package/lib/performanceNow.js +42 -0
- package/lib/shallowEqual.js +49 -0
- package/lib/shouldUpdateReactComponent.js +58 -0
- package/lib/toArray.js +75 -0
- package/lib/traverseAllChildren.js +189 -0
- package/lib/warning.js +40 -0
- package/package.json +32 -21
- package/react.js +1 -0
- package/.npmignore +0 -7
- package/.travis.yml +0 -5
- package/Jakefile.js +0 -39
- package/LICENSE +0 -19
- package/browser-test/dist.html +0 -90
- package/browser-test/index.html +0 -86
- package/browser-test/min.html +0 -90
- package/dist/react.js +0 -3107
- package/dist/react.min.js +0 -22
- package/doc/advanced.md +0 -174
- package/doc/color-def.graffle +0 -938
- package/doc/color-def.png +0 -0
- package/doc/simple.dot +0 -25
- package/doc/simple.png +0 -0
- package/examples/longer-example.js +0 -41
- package/examples/simple.js +0 -45
- package/examples/using-ast-directly.js +0 -30
- package/examples/using-events1.js +0 -79
- package/examples/using-log-events.js +0 -43
- package/lib/base-task.js +0 -123
- package/lib/cb-task.js +0 -84
- package/lib/core.js +0 -138
- package/lib/dsl.js +0 -138
- package/lib/error.js +0 -55
- package/lib/event-collector.js +0 -81
- package/lib/event-manager.js +0 -89
- package/lib/eventemitter.js +0 -20
- package/lib/finalcb-first-task.js +0 -68
- package/lib/finalcb-task.js +0 -65
- package/lib/id.js +0 -22
- package/lib/input-parser.js +0 -56
- package/lib/log-events.js +0 -101
- package/lib/parse.js +0 -41
- package/lib/promise-resolve.js +0 -50
- package/lib/promise-task.js +0 -93
- package/lib/react.js +0 -59
- package/lib/ret-task.js +0 -71
- package/lib/sprintf.js +0 -18
- package/lib/status.js +0 -14
- package/lib/task.js +0 -251
- package/lib/track-tasks.js +0 -74
- package/lib/validate.js +0 -159
- package/lib/vcon.js +0 -90
- package/lib/when-task.js +0 -85
- package/src/dist.build.requirejs +0 -20
- package/test/ast.mocha.js +0 -136
- package/test/cb-task.mocha.js +0 -220
- package/test/core-deferred.mocha.js +0 -143
- package/test/core-when.mocha.js +0 -96
- package/test/core.mocha.js +0 -589
- package/test/dsl.mocha.js +0 -350
- package/test/event-manager.mocha.js +0 -119
- package/test/exec-options.mocha.js +0 -48
- package/test/finalcb-task.mocha.js +0 -58
- package/test/input-parser.mocha.js +0 -86
- package/test/log-events.mocha.js +0 -88
- package/test/mocha.opts +0 -2
- package/test/module-use.mocha.js +0 -147
- package/test/promise-auto-resolve.mocha.js +0 -68
- package/test/ret-task.mocha.js +0 -220
- package/test/task.mocha.js +0 -42
- package/test/validate-cb-task.mocha.js +0 -100
- package/test/validate-ret-task.mocha.js +0 -110
- package/test/validate.mocha.js +0 -324
- package/test/vcon.mocha.js +0 -193
- package/vendor/chai/chai.js +0 -2038
- package/vendor/jquery/jquery-1.7.1.js +0 -9266
- package/vendor/jquery/jquery-1.7.1.min.js +0 -4
- package/vendor/mocha/mocha.css +0 -135
- package/vendor/mocha/mocha.js +0 -3589
- package/vendor/node/util.js +0 -531
- package/vendor/requirejs/require.js +0 -2053
- package/vendor/requirejs/require.min.js +0 -33
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2013 Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*
|
|
16
|
+
* @providesModule ReactMountReady
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
"use strict";
|
|
20
|
+
|
|
21
|
+
var PooledClass = require("./PooledClass");
|
|
22
|
+
|
|
23
|
+
var mixInto = require("./mixInto");
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* A specialized pseudo-event module to help keep track of components waiting to
|
|
27
|
+
* be notified when their DOM representations are available for use.
|
|
28
|
+
*
|
|
29
|
+
* This implements `PooledClass`, so you should never need to instantiate this.
|
|
30
|
+
* Instead, use `ReactMountReady.getPooled()`.
|
|
31
|
+
*
|
|
32
|
+
* @param {?array<function>} initialCollection
|
|
33
|
+
* @class ReactMountReady
|
|
34
|
+
* @implements PooledClass
|
|
35
|
+
* @internal
|
|
36
|
+
*/
|
|
37
|
+
function ReactMountReady(initialCollection) {
|
|
38
|
+
this._queue = initialCollection || null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
mixInto(ReactMountReady, {
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Enqueues a callback to be invoked when `notifyAll` is invoked. This is used
|
|
45
|
+
* to enqueue calls to `componentDidMount` and `componentDidUpdate`.
|
|
46
|
+
*
|
|
47
|
+
* @param {ReactComponent} component Component being rendered.
|
|
48
|
+
* @param {function(DOMElement)} callback Invoked when `notifyAll` is invoked.
|
|
49
|
+
* @internal
|
|
50
|
+
*/
|
|
51
|
+
enqueue: function(component, callback) {
|
|
52
|
+
this._queue = this._queue || [];
|
|
53
|
+
this._queue.push({component: component, callback: callback});
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Invokes all enqueued callbacks and clears the queue. This is invoked after
|
|
58
|
+
* the DOM representation of a component has been created or updated.
|
|
59
|
+
*
|
|
60
|
+
* @internal
|
|
61
|
+
*/
|
|
62
|
+
notifyAll: function() {
|
|
63
|
+
var queue = this._queue;
|
|
64
|
+
if (queue) {
|
|
65
|
+
this._queue = null;
|
|
66
|
+
for (var i = 0, l = queue.length; i < l; i++) {
|
|
67
|
+
var component = queue[i].component;
|
|
68
|
+
var callback = queue[i].callback;
|
|
69
|
+
callback.call(component);
|
|
70
|
+
}
|
|
71
|
+
queue.length = 0;
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Resets the internal queue.
|
|
77
|
+
*
|
|
78
|
+
* @internal
|
|
79
|
+
*/
|
|
80
|
+
reset: function() {
|
|
81
|
+
this._queue = null;
|
|
82
|
+
},
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* `PooledClass` looks for this.
|
|
86
|
+
*/
|
|
87
|
+
destructor: function() {
|
|
88
|
+
this.reset();
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
PooledClass.addPoolingTo(ReactMountReady);
|
|
94
|
+
|
|
95
|
+
module.exports = ReactMountReady;
|
|
@@ -0,0 +1,425 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright 2013 Facebook, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*
|
|
16
|
+
* @providesModule ReactMultiChild
|
|
17
|
+
* @typechecks static-only
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
"use strict";
|
|
21
|
+
|
|
22
|
+
var ReactComponent = require("./ReactComponent");
|
|
23
|
+
var ReactMultiChildUpdateTypes = require("./ReactMultiChildUpdateTypes");
|
|
24
|
+
|
|
25
|
+
var flattenChildren = require("./flattenChildren");
|
|
26
|
+
var shouldUpdateReactComponent = require("./shouldUpdateReactComponent");
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Updating children of a component may trigger recursive updates. The depth is
|
|
30
|
+
* used to batch recursive updates to render markup more efficiently.
|
|
31
|
+
*
|
|
32
|
+
* @type {number}
|
|
33
|
+
* @private
|
|
34
|
+
*/
|
|
35
|
+
var updateDepth = 0;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Queue of update configuration objects.
|
|
39
|
+
*
|
|
40
|
+
* Each object has a `type` property that is in `ReactMultiChildUpdateTypes`.
|
|
41
|
+
*
|
|
42
|
+
* @type {array<object>}
|
|
43
|
+
* @private
|
|
44
|
+
*/
|
|
45
|
+
var updateQueue = [];
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Queue of markup to be rendered.
|
|
49
|
+
*
|
|
50
|
+
* @type {array<string>}
|
|
51
|
+
* @private
|
|
52
|
+
*/
|
|
53
|
+
var markupQueue = [];
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Enqueues markup to be rendered and inserted at a supplied index.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} parentID ID of the parent component.
|
|
59
|
+
* @param {string} markup Markup that renders into an element.
|
|
60
|
+
* @param {number} toIndex Destination index.
|
|
61
|
+
* @private
|
|
62
|
+
*/
|
|
63
|
+
function enqueueMarkup(parentID, markup, toIndex) {
|
|
64
|
+
// NOTE: Null values reduce hidden classes.
|
|
65
|
+
updateQueue.push({
|
|
66
|
+
parentID: parentID,
|
|
67
|
+
parentNode: null,
|
|
68
|
+
type: ReactMultiChildUpdateTypes.INSERT_MARKUP,
|
|
69
|
+
markupIndex: markupQueue.push(markup) - 1,
|
|
70
|
+
textContent: null,
|
|
71
|
+
fromIndex: null,
|
|
72
|
+
toIndex: toIndex
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Enqueues moving an existing element to another index.
|
|
78
|
+
*
|
|
79
|
+
* @param {string} parentID ID of the parent component.
|
|
80
|
+
* @param {number} fromIndex Source index of the existing element.
|
|
81
|
+
* @param {number} toIndex Destination index of the element.
|
|
82
|
+
* @private
|
|
83
|
+
*/
|
|
84
|
+
function enqueueMove(parentID, fromIndex, toIndex) {
|
|
85
|
+
// NOTE: Null values reduce hidden classes.
|
|
86
|
+
updateQueue.push({
|
|
87
|
+
parentID: parentID,
|
|
88
|
+
parentNode: null,
|
|
89
|
+
type: ReactMultiChildUpdateTypes.MOVE_EXISTING,
|
|
90
|
+
markupIndex: null,
|
|
91
|
+
textContent: null,
|
|
92
|
+
fromIndex: fromIndex,
|
|
93
|
+
toIndex: toIndex
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Enqueues removing an element at an index.
|
|
99
|
+
*
|
|
100
|
+
* @param {string} parentID ID of the parent component.
|
|
101
|
+
* @param {number} fromIndex Index of the element to remove.
|
|
102
|
+
* @private
|
|
103
|
+
*/
|
|
104
|
+
function enqueueRemove(parentID, fromIndex) {
|
|
105
|
+
// NOTE: Null values reduce hidden classes.
|
|
106
|
+
updateQueue.push({
|
|
107
|
+
parentID: parentID,
|
|
108
|
+
parentNode: null,
|
|
109
|
+
type: ReactMultiChildUpdateTypes.REMOVE_NODE,
|
|
110
|
+
markupIndex: null,
|
|
111
|
+
textContent: null,
|
|
112
|
+
fromIndex: fromIndex,
|
|
113
|
+
toIndex: null
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Enqueues setting the text content.
|
|
119
|
+
*
|
|
120
|
+
* @param {string} parentID ID of the parent component.
|
|
121
|
+
* @param {string} textContent Text content to set.
|
|
122
|
+
* @private
|
|
123
|
+
*/
|
|
124
|
+
function enqueueTextContent(parentID, textContent) {
|
|
125
|
+
// NOTE: Null values reduce hidden classes.
|
|
126
|
+
updateQueue.push({
|
|
127
|
+
parentID: parentID,
|
|
128
|
+
parentNode: null,
|
|
129
|
+
type: ReactMultiChildUpdateTypes.TEXT_CONTENT,
|
|
130
|
+
markupIndex: null,
|
|
131
|
+
textContent: textContent,
|
|
132
|
+
fromIndex: null,
|
|
133
|
+
toIndex: null
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Processes any enqueued updates.
|
|
139
|
+
*
|
|
140
|
+
* @private
|
|
141
|
+
*/
|
|
142
|
+
function processQueue() {
|
|
143
|
+
if (updateQueue.length) {
|
|
144
|
+
ReactComponent.BackendIDOperations.dangerouslyProcessChildrenUpdates(
|
|
145
|
+
updateQueue,
|
|
146
|
+
markupQueue
|
|
147
|
+
);
|
|
148
|
+
clearQueue();
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Clears any enqueued updates.
|
|
154
|
+
*
|
|
155
|
+
* @private
|
|
156
|
+
*/
|
|
157
|
+
function clearQueue() {
|
|
158
|
+
updateQueue.length = 0;
|
|
159
|
+
markupQueue.length = 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* ReactMultiChild are capable of reconciling multiple children.
|
|
164
|
+
*
|
|
165
|
+
* @class ReactMultiChild
|
|
166
|
+
* @internal
|
|
167
|
+
*/
|
|
168
|
+
var ReactMultiChild = {
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Provides common functionality for components that must reconcile multiple
|
|
172
|
+
* children. This is used by `ReactDOMComponent` to mount, update, and
|
|
173
|
+
* unmount child components.
|
|
174
|
+
*
|
|
175
|
+
* @lends {ReactMultiChild.prototype}
|
|
176
|
+
*/
|
|
177
|
+
Mixin: {
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Generates a "mount image" for each of the supplied children. In the case
|
|
181
|
+
* of `ReactDOMComponent`, a mount image is a string of markup.
|
|
182
|
+
*
|
|
183
|
+
* @param {?object} nestedChildren Nested child maps.
|
|
184
|
+
* @return {array} An array of mounted representations.
|
|
185
|
+
* @internal
|
|
186
|
+
*/
|
|
187
|
+
mountChildren: function(nestedChildren, transaction) {
|
|
188
|
+
var children = flattenChildren(nestedChildren);
|
|
189
|
+
var mountImages = [];
|
|
190
|
+
var index = 0;
|
|
191
|
+
this._renderedChildren = children;
|
|
192
|
+
for (var name in children) {
|
|
193
|
+
var child = children[name];
|
|
194
|
+
if (children.hasOwnProperty(name)) {
|
|
195
|
+
// Inlined for performance, see `ReactInstanceHandles.createReactID`.
|
|
196
|
+
var rootID = this._rootNodeID + name;
|
|
197
|
+
var mountImage = child.mountComponent(
|
|
198
|
+
rootID,
|
|
199
|
+
transaction,
|
|
200
|
+
this._mountDepth + 1
|
|
201
|
+
);
|
|
202
|
+
child._mountIndex = index;
|
|
203
|
+
mountImages.push(mountImage);
|
|
204
|
+
index++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return mountImages;
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Replaces any rendered children with a text content string.
|
|
212
|
+
*
|
|
213
|
+
* @param {string} nextContent String of content.
|
|
214
|
+
* @internal
|
|
215
|
+
*/
|
|
216
|
+
updateTextContent: function(nextContent) {
|
|
217
|
+
updateDepth++;
|
|
218
|
+
var errorThrown = true;
|
|
219
|
+
try {
|
|
220
|
+
var prevChildren = this._renderedChildren;
|
|
221
|
+
// Remove any rendered children.
|
|
222
|
+
for (var name in prevChildren) {
|
|
223
|
+
if (prevChildren.hasOwnProperty(name)) {
|
|
224
|
+
this._unmountChildByName(prevChildren[name], name);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Set new text content.
|
|
228
|
+
this.setTextContent(nextContent);
|
|
229
|
+
errorThrown = false;
|
|
230
|
+
} finally {
|
|
231
|
+
updateDepth--;
|
|
232
|
+
if (!updateDepth) {
|
|
233
|
+
errorThrown ? clearQueue() : processQueue();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Updates the rendered children with new children.
|
|
240
|
+
*
|
|
241
|
+
* @param {?object} nextNestedChildren Nested child maps.
|
|
242
|
+
* @param {ReactReconcileTransaction} transaction
|
|
243
|
+
* @internal
|
|
244
|
+
*/
|
|
245
|
+
updateChildren: function(nextNestedChildren, transaction) {
|
|
246
|
+
updateDepth++;
|
|
247
|
+
var errorThrown = true;
|
|
248
|
+
try {
|
|
249
|
+
this._updateChildren(nextNestedChildren, transaction);
|
|
250
|
+
errorThrown = false;
|
|
251
|
+
} finally {
|
|
252
|
+
updateDepth--;
|
|
253
|
+
if (!updateDepth) {
|
|
254
|
+
errorThrown ? clearQueue() : processQueue();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Improve performance by isolating this hot code path from the try/catch
|
|
261
|
+
* block in `updateChildren`.
|
|
262
|
+
*
|
|
263
|
+
* @param {?object} nextNestedChildren Nested child maps.
|
|
264
|
+
* @param {ReactReconcileTransaction} transaction
|
|
265
|
+
* @final
|
|
266
|
+
* @protected
|
|
267
|
+
*/
|
|
268
|
+
_updateChildren: function(nextNestedChildren, transaction) {
|
|
269
|
+
var nextChildren = flattenChildren(nextNestedChildren);
|
|
270
|
+
var prevChildren = this._renderedChildren;
|
|
271
|
+
if (!nextChildren && !prevChildren) {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
var name;
|
|
275
|
+
// `nextIndex` will increment for each child in `nextChildren`, but
|
|
276
|
+
// `lastIndex` will be the last index visited in `prevChildren`.
|
|
277
|
+
var lastIndex = 0;
|
|
278
|
+
var nextIndex = 0;
|
|
279
|
+
for (name in nextChildren) {
|
|
280
|
+
if (!nextChildren.hasOwnProperty(name)) {
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
var prevChild = prevChildren && prevChildren[name];
|
|
284
|
+
var nextChild = nextChildren[name];
|
|
285
|
+
if (shouldUpdateReactComponent(prevChild, nextChild)) {
|
|
286
|
+
this.moveChild(prevChild, nextIndex, lastIndex);
|
|
287
|
+
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
|
|
288
|
+
prevChild.receiveComponent(nextChild, transaction);
|
|
289
|
+
prevChild._mountIndex = nextIndex;
|
|
290
|
+
} else {
|
|
291
|
+
if (prevChild) {
|
|
292
|
+
// Update `lastIndex` before `_mountIndex` gets unset by unmounting.
|
|
293
|
+
lastIndex = Math.max(prevChild._mountIndex, lastIndex);
|
|
294
|
+
this._unmountChildByName(prevChild, name);
|
|
295
|
+
}
|
|
296
|
+
this._mountChildByNameAtIndex(
|
|
297
|
+
nextChild, name, nextIndex, transaction
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
nextIndex++;
|
|
301
|
+
}
|
|
302
|
+
// Remove children that are no longer present.
|
|
303
|
+
for (name in prevChildren) {
|
|
304
|
+
if (prevChildren.hasOwnProperty(name) &&
|
|
305
|
+
!(nextChildren && nextChildren[name])) {
|
|
306
|
+
this._unmountChildByName(prevChildren[name], name);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Unmounts all rendered children. This should be used to clean up children
|
|
313
|
+
* when this component is unmounted.
|
|
314
|
+
*
|
|
315
|
+
* @internal
|
|
316
|
+
*/
|
|
317
|
+
unmountChildren: function() {
|
|
318
|
+
var renderedChildren = this._renderedChildren;
|
|
319
|
+
for (var name in renderedChildren) {
|
|
320
|
+
var renderedChild = renderedChildren[name];
|
|
321
|
+
// TODO: When is this not true?
|
|
322
|
+
if (renderedChild.unmountComponent) {
|
|
323
|
+
renderedChild.unmountComponent();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
this._renderedChildren = null;
|
|
327
|
+
},
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Moves a child component to the supplied index.
|
|
331
|
+
*
|
|
332
|
+
* @param {ReactComponent} child Component to move.
|
|
333
|
+
* @param {number} toIndex Destination index of the element.
|
|
334
|
+
* @param {number} lastIndex Last index visited of the siblings of `child`.
|
|
335
|
+
* @protected
|
|
336
|
+
*/
|
|
337
|
+
moveChild: function(child, toIndex, lastIndex) {
|
|
338
|
+
// If the index of `child` is less than `lastIndex`, then it needs to
|
|
339
|
+
// be moved. Otherwise, we do not need to move it because a child will be
|
|
340
|
+
// inserted or moved before `child`.
|
|
341
|
+
if (child._mountIndex < lastIndex) {
|
|
342
|
+
enqueueMove(this._rootNodeID, child._mountIndex, toIndex);
|
|
343
|
+
}
|
|
344
|
+
},
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Creates a child component.
|
|
348
|
+
*
|
|
349
|
+
* @param {ReactComponent} child Component to create.
|
|
350
|
+
* @param {string} mountImage Markup to insert.
|
|
351
|
+
* @protected
|
|
352
|
+
*/
|
|
353
|
+
createChild: function(child, mountImage) {
|
|
354
|
+
enqueueMarkup(this._rootNodeID, mountImage, child._mountIndex);
|
|
355
|
+
},
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Removes a child component.
|
|
359
|
+
*
|
|
360
|
+
* @param {ReactComponent} child Child to remove.
|
|
361
|
+
* @protected
|
|
362
|
+
*/
|
|
363
|
+
removeChild: function(child) {
|
|
364
|
+
enqueueRemove(this._rootNodeID, child._mountIndex);
|
|
365
|
+
},
|
|
366
|
+
|
|
367
|
+
/**
|
|
368
|
+
* Sets this text content string.
|
|
369
|
+
*
|
|
370
|
+
* @param {string} textContent Text content to set.
|
|
371
|
+
* @protected
|
|
372
|
+
*/
|
|
373
|
+
setTextContent: function(textContent) {
|
|
374
|
+
enqueueTextContent(this._rootNodeID, textContent);
|
|
375
|
+
},
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Mounts a child with the supplied name.
|
|
379
|
+
*
|
|
380
|
+
* NOTE: This is part of `updateChildren` and is here for readability.
|
|
381
|
+
*
|
|
382
|
+
* @param {ReactComponent} child Component to mount.
|
|
383
|
+
* @param {string} name Name of the child.
|
|
384
|
+
* @param {number} index Index at which to insert the child.
|
|
385
|
+
* @param {ReactReconcileTransaction} transaction
|
|
386
|
+
* @private
|
|
387
|
+
*/
|
|
388
|
+
_mountChildByNameAtIndex: function(child, name, index, transaction) {
|
|
389
|
+
// Inlined for performance, see `ReactInstanceHandles.createReactID`.
|
|
390
|
+
var rootID = this._rootNodeID + name;
|
|
391
|
+
var mountImage = child.mountComponent(
|
|
392
|
+
rootID,
|
|
393
|
+
transaction,
|
|
394
|
+
this._mountDepth + 1
|
|
395
|
+
);
|
|
396
|
+
child._mountIndex = index;
|
|
397
|
+
this.createChild(child, mountImage);
|
|
398
|
+
this._renderedChildren = this._renderedChildren || {};
|
|
399
|
+
this._renderedChildren[name] = child;
|
|
400
|
+
},
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Unmounts a rendered child by name.
|
|
404
|
+
*
|
|
405
|
+
* NOTE: This is part of `updateChildren` and is here for readability.
|
|
406
|
+
*
|
|
407
|
+
* @param {ReactComponent} child Component to unmount.
|
|
408
|
+
* @param {string} name Name of the child in `this._renderedChildren`.
|
|
409
|
+
* @private
|
|
410
|
+
*/
|
|
411
|
+
_unmountChildByName: function(child, name) {
|
|
412
|
+
// TODO: When is this not true?
|
|
413
|
+
if (ReactComponent.isValidComponent(child)) {
|
|
414
|
+
this.removeChild(child);
|
|
415
|
+
child._mountIndex = null;
|
|
416
|
+
child.unmountComponent();
|
|
417
|
+
delete this._renderedChildren[name];
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
};
|
|
424
|
+
|
|
425
|
+
module.exports = ReactMultiChild;
|