@tarojs/react 4.0.1-alpha.1 → 4.0.1
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/LICENSE +8 -8
- package/dist/index.d.ts +26 -16
- package/dist/index.js +816 -0
- package/dist/index.js.map +1 -0
- package/dist/react.esm.d.ts +43 -0
- package/dist/react.esm.js +18 -177
- package/dist/react.esm.js.map +1 -1
- package/package.json +18 -14
- package/dist/componentTree.d.ts +0 -19
- package/dist/constant.d.ts +0 -7
- package/dist/domInput.d.ts +0 -12
- package/dist/event.d.ts +0 -13
- package/dist/inputValueTracking.d.ts +0 -3
- package/dist/props.d.ts +0 -5
- package/dist/reconciler.d.ts +0 -4
- package/dist/render.d.ts +0 -25
- package/dist/workTags.d.ts +0 -26
package/dist/index.js
ADDED
|
@@ -0,0 +1,816 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var shared = require('@tarojs/shared');
|
|
6
|
+
var runtime = require('@tarojs/runtime');
|
|
7
|
+
var Reconciler = require('react-reconciler');
|
|
8
|
+
var constants = require('react-reconciler/constants');
|
|
9
|
+
|
|
10
|
+
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
11
|
+
|
|
12
|
+
var Reconciler__default = /*#__PURE__*/_interopDefaultLegacy(Reconciler);
|
|
13
|
+
|
|
14
|
+
var supportedInputTypes = {
|
|
15
|
+
color: true,
|
|
16
|
+
date: true,
|
|
17
|
+
datetime: true,
|
|
18
|
+
'datetime-local': true,
|
|
19
|
+
email: true,
|
|
20
|
+
month: true,
|
|
21
|
+
number: true,
|
|
22
|
+
password: true,
|
|
23
|
+
range: true,
|
|
24
|
+
search: true,
|
|
25
|
+
tel: true,
|
|
26
|
+
text: true,
|
|
27
|
+
time: true,
|
|
28
|
+
url: true,
|
|
29
|
+
week: true,
|
|
30
|
+
};
|
|
31
|
+
var SyncLane = 1;
|
|
32
|
+
var InputContinuousLane = 4;
|
|
33
|
+
var DefaultLane = 16;
|
|
34
|
+
var DiscreteEventPriority = SyncLane;
|
|
35
|
+
var ContinuousEventPriority = InputContinuousLane;
|
|
36
|
+
var DefaultEventPriority = DefaultLane;
|
|
37
|
+
function getEventPriority(domEventName) {
|
|
38
|
+
switch (domEventName) {
|
|
39
|
+
case 'cancel':
|
|
40
|
+
case 'click':
|
|
41
|
+
case 'close':
|
|
42
|
+
case 'contextmenu':
|
|
43
|
+
case 'copy':
|
|
44
|
+
case 'cut':
|
|
45
|
+
case 'dragend':
|
|
46
|
+
case 'dragstart':
|
|
47
|
+
case 'drop':
|
|
48
|
+
case 'input':
|
|
49
|
+
case 'paste':
|
|
50
|
+
case 'pause':
|
|
51
|
+
case 'play':
|
|
52
|
+
case 'pointercancel':
|
|
53
|
+
case 'pointerdown':
|
|
54
|
+
case 'pointerup':
|
|
55
|
+
case 'reset':
|
|
56
|
+
case 'resize':
|
|
57
|
+
case 'submit':
|
|
58
|
+
case 'touchcancel':
|
|
59
|
+
case 'touchend':
|
|
60
|
+
case 'touchstart':
|
|
61
|
+
case 'change':
|
|
62
|
+
case 'blur':
|
|
63
|
+
case 'focus':
|
|
64
|
+
case 'select':
|
|
65
|
+
case 'selectstart':
|
|
66
|
+
return DiscreteEventPriority;
|
|
67
|
+
case 'drag':
|
|
68
|
+
case 'dragenter':
|
|
69
|
+
case 'dragexit':
|
|
70
|
+
case 'dragleave':
|
|
71
|
+
case 'dragover':
|
|
72
|
+
case 'pointermove':
|
|
73
|
+
case 'pointerout':
|
|
74
|
+
case 'pointerover':
|
|
75
|
+
case 'scroll':
|
|
76
|
+
case 'toggle':
|
|
77
|
+
case 'touchmove':
|
|
78
|
+
case 'pointerenter':
|
|
79
|
+
case 'pointerleave':
|
|
80
|
+
return ContinuousEventPriority;
|
|
81
|
+
default:
|
|
82
|
+
return DefaultEventPriority;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
var randomKey = Math.random()
|
|
86
|
+
.toString(36)
|
|
87
|
+
.slice(2);
|
|
88
|
+
var internalPropsKey = '__reactProps$' + randomKey;
|
|
89
|
+
var internalInstanceKey = '__reactFiber$' + randomKey;
|
|
90
|
+
var internalContainerInstanceKey = '__reactContainer$' + randomKey;
|
|
91
|
+
// const internalEventHandlersKey = '__reactEvents$' + randomKey
|
|
92
|
+
// const internalEventHandlerListenersKey = '__reactListeners$' + randomKey
|
|
93
|
+
// const internalEventHandlesSetKey = '__reactHandles$' + randomKey
|
|
94
|
+
|
|
95
|
+
var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
|
|
96
|
+
var HostComponent = 5;
|
|
97
|
+
var HostText = 6;
|
|
98
|
+
var SuspenseComponent = 13;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* 给 TaroElement 绑定 react fiber、react props 等属性
|
|
102
|
+
* 提供 fiber -> element、element -> fiber、element -> props 的方法
|
|
103
|
+
*/
|
|
104
|
+
function precacheFiberNode(hostInst, node) {
|
|
105
|
+
node[internalInstanceKey] = hostInst;
|
|
106
|
+
}
|
|
107
|
+
function markContainerAsRoot(hostRoot, node) {
|
|
108
|
+
node[internalContainerInstanceKey] = hostRoot;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
|
|
112
|
+
* instance, or null if the node was not rendered by this React.
|
|
113
|
+
*/
|
|
114
|
+
function getInstanceFromNode(node) {
|
|
115
|
+
var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
|
|
116
|
+
if (inst) {
|
|
117
|
+
if (inst.tag === HostComponent ||
|
|
118
|
+
inst.tag === HostText ||
|
|
119
|
+
inst.tag === SuspenseComponent ||
|
|
120
|
+
inst.tag === HostRoot) {
|
|
121
|
+
return inst;
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
|
|
131
|
+
* DOM node.
|
|
132
|
+
*/
|
|
133
|
+
function getNodeFromInstance(inst) {
|
|
134
|
+
if (inst.tag === HostComponent || inst.tag === HostText) {
|
|
135
|
+
// In Fiber this, is just the state node right now. We assume it will be
|
|
136
|
+
// a host component or host text.
|
|
137
|
+
return inst.stateNode;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function getFiberCurrentPropsFromNode(node) {
|
|
141
|
+
return node[internalPropsKey] || null;
|
|
142
|
+
}
|
|
143
|
+
function updateFiberProps(node, props) {
|
|
144
|
+
node[internalPropsKey] = props;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// 从 props 中,更新 input 组件的 value 值
|
|
148
|
+
function updateInputWrapper(element, oldValue, props) {
|
|
149
|
+
var node = element;
|
|
150
|
+
var checked = props.checked;
|
|
151
|
+
if (checked != null) {
|
|
152
|
+
console.warn('updateCheck 未实现', node);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
updateWrapper(element, oldValue, props);
|
|
156
|
+
updateNamedCousins(element, props);
|
|
157
|
+
}
|
|
158
|
+
// react 中原本处理 type=radio 的逻辑,这里留个空,暂时不处理
|
|
159
|
+
function updateNamedCousins(rootNode, props) {
|
|
160
|
+
var name = props.name;
|
|
161
|
+
if (props.type === 'radio' && name != null) {
|
|
162
|
+
console.warn('radio updateNamedCousins 未实现', rootNode, props);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function getToStringValue(value) {
|
|
166
|
+
var isEmptyType = typeof value === 'function' || typeof value === 'symbol';
|
|
167
|
+
return isEmptyType ? '' : value;
|
|
168
|
+
}
|
|
169
|
+
function toString(value) {
|
|
170
|
+
return '' + value;
|
|
171
|
+
}
|
|
172
|
+
function updateWrapper(element, oldValue, props) {
|
|
173
|
+
var node = element;
|
|
174
|
+
var value = getToStringValue(props.value);
|
|
175
|
+
var type = props.type;
|
|
176
|
+
setNodeValue(node, oldValue, value, type);
|
|
177
|
+
}
|
|
178
|
+
// oldValue 为 event.detail.value,value 为 fiber.props.value
|
|
179
|
+
// 如果 oldValue 和 value 不相等,代表受控组件需要更新
|
|
180
|
+
// 更新的原则为,fiber.props.value 永远为用户所需要的值,因此 node.value = toString(value)
|
|
181
|
+
function setNodeValue(node, oldValue, value, type) {
|
|
182
|
+
if ( type === void 0 ) type = 'string';
|
|
183
|
+
|
|
184
|
+
if (value != null) {
|
|
185
|
+
if (type === 'number') {
|
|
186
|
+
if ((value === 0 && node.value === '') ||
|
|
187
|
+
// We explicitly want to coerce to number here if possible.
|
|
188
|
+
// eslint-disable-next-line
|
|
189
|
+
oldValue != value) {
|
|
190
|
+
node.value = toString(value);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else if (oldValue !== toString(value)) {
|
|
194
|
+
node.value = toString(value);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
else if (type === 'submit' || type === 'reset') {
|
|
198
|
+
// Submit/reset inputs need the attribute removed completely to avoid
|
|
199
|
+
// blank-text buttons.
|
|
200
|
+
node.removeAttribute('value');
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// 判断当前 TaroElement 是否为 supportedInputTypes input 或 textarea
|
|
204
|
+
function isTextInputElement(elem) {
|
|
205
|
+
var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
|
|
206
|
+
if (nodeName === 'input') {
|
|
207
|
+
var type = elem.type;
|
|
208
|
+
return !type || !!supportedInputTypes[type];
|
|
209
|
+
}
|
|
210
|
+
if (nodeName === 'textarea') {
|
|
211
|
+
return true;
|
|
212
|
+
}
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
var ReactDOMTextareaRestoreControlledState = updateWrapper;
|
|
216
|
+
var ReactDOMInputRestoreControlledState = updateInputWrapper;
|
|
217
|
+
|
|
218
|
+
function isCheckable(elem) {
|
|
219
|
+
var type = elem.type;
|
|
220
|
+
var nodeName = elem.nodeName;
|
|
221
|
+
return (nodeName &&
|
|
222
|
+
nodeName.toLowerCase() === 'input' &&
|
|
223
|
+
(type === 'checkbox' || type === 'radio'));
|
|
224
|
+
}
|
|
225
|
+
function getTracker(node) {
|
|
226
|
+
return node._valueTracker;
|
|
227
|
+
}
|
|
228
|
+
function detachTracker(node) {
|
|
229
|
+
node._valueTracker = null;
|
|
230
|
+
}
|
|
231
|
+
// 之所以单独创建一个 tacker,是为了统一监听不同 type 的 input 值
|
|
232
|
+
// 比如 type=checkbox 或者 type=radio,就需要监听 checked,而不是 value
|
|
233
|
+
// 虽然目前还未实现 checkbox 和 radio 的 finishEventHandle,但后续不好说,所以先统一和 react 一样的写法
|
|
234
|
+
// 需要特别注意的是,tracker 初始化时的值为 node 的初始值,但后续会变更为事件的 detail.value 值
|
|
235
|
+
function trackValueOnNode(node) {
|
|
236
|
+
var valueField = isCheckable(node) ? 'checked' : 'value';
|
|
237
|
+
var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
|
|
238
|
+
var currentValue = '' + node[valueField];
|
|
239
|
+
if (node.hasOwnProperty(valueField) ||
|
|
240
|
+
typeof descriptor === 'undefined' ||
|
|
241
|
+
typeof descriptor.get !== 'function' ||
|
|
242
|
+
typeof descriptor.set !== 'function') {
|
|
243
|
+
return;
|
|
244
|
+
}
|
|
245
|
+
var get = descriptor.get;
|
|
246
|
+
var set = descriptor.set;
|
|
247
|
+
Object.defineProperty(node, valueField, {
|
|
248
|
+
configurable: true,
|
|
249
|
+
enumerable: descriptor.enumerable,
|
|
250
|
+
get: function () {
|
|
251
|
+
return get.call(this);
|
|
252
|
+
},
|
|
253
|
+
set: function (value) {
|
|
254
|
+
currentValue = '' + value;
|
|
255
|
+
set.call(this, value);
|
|
256
|
+
},
|
|
257
|
+
});
|
|
258
|
+
var tracker = {
|
|
259
|
+
getValue: function getValue() {
|
|
260
|
+
return currentValue;
|
|
261
|
+
},
|
|
262
|
+
setValue: function setValue(value) {
|
|
263
|
+
currentValue = '' + value;
|
|
264
|
+
},
|
|
265
|
+
stopTracking: function stopTracking() {
|
|
266
|
+
detachTracker(node);
|
|
267
|
+
delete node[valueField];
|
|
268
|
+
},
|
|
269
|
+
};
|
|
270
|
+
return tracker;
|
|
271
|
+
}
|
|
272
|
+
function track(node) {
|
|
273
|
+
if (getTracker(node)) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
node._valueTracker = trackValueOnNode(node);
|
|
277
|
+
}
|
|
278
|
+
function updateValueIfChanged(node, nextValue) {
|
|
279
|
+
if (!node) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
var tracker = getTracker(node);
|
|
283
|
+
if (!tracker) {
|
|
284
|
+
return true;
|
|
285
|
+
}
|
|
286
|
+
var lastValue = tracker.getValue();
|
|
287
|
+
if (nextValue !== lastValue) {
|
|
288
|
+
tracker.setValue(nextValue);
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function isEventName(s) {
|
|
295
|
+
return s[0] === 'o' && s[1] === 'n';
|
|
296
|
+
}
|
|
297
|
+
var IS_NON_DIMENSIONAL = /aspect|acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
|
|
298
|
+
function updateProps(dom, oldProps, newProps) {
|
|
299
|
+
var updatePayload = getUpdatePayload(dom, oldProps, newProps);
|
|
300
|
+
if (updatePayload) {
|
|
301
|
+
updatePropsByPayload(dom, oldProps, updatePayload);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
function updatePropsByPayload(dom, oldProps, updatePayload) {
|
|
305
|
+
for (var i = 0; i < updatePayload.length; i += 2) { // key, value 成对出现
|
|
306
|
+
var key = updatePayload[i];
|
|
307
|
+
var newProp = updatePayload[i + 1];
|
|
308
|
+
var oldProp = oldProps[key];
|
|
309
|
+
setProperty(dom, key, newProp, oldProp);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function getUpdatePayload(dom, oldProps, newProps) {
|
|
313
|
+
var i;
|
|
314
|
+
var updatePayload = null;
|
|
315
|
+
for (i in oldProps) {
|
|
316
|
+
if (!(i in newProps)) {
|
|
317
|
+
(updatePayload = updatePayload || []).push(i, null);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
var isFormElement = dom instanceof runtime.FormElement;
|
|
321
|
+
for (i in newProps) {
|
|
322
|
+
if (oldProps[i] !== newProps[i] || (isFormElement && i === 'value')) {
|
|
323
|
+
(updatePayload = updatePayload || []).push(i, newProps[i]);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
return updatePayload;
|
|
327
|
+
}
|
|
328
|
+
// function eventProxy (e: CommonEvent) {
|
|
329
|
+
// const el = document.getElementById(e.currentTarget.id)
|
|
330
|
+
// const handlers = el!.__handlers[e.type]
|
|
331
|
+
// handlers[0](e)
|
|
332
|
+
// }
|
|
333
|
+
function setEvent(dom, name, value, oldValue) {
|
|
334
|
+
var isCapture = name.endsWith('Capture');
|
|
335
|
+
var eventName = name.toLowerCase().slice(2);
|
|
336
|
+
if (isCapture) {
|
|
337
|
+
eventName = eventName.slice(0, -7);
|
|
338
|
+
}
|
|
339
|
+
var compName = shared.capitalize(shared.toCamelCase(dom.tagName.toLowerCase()));
|
|
340
|
+
if (eventName === 'click' && compName in shared.internalComponents) {
|
|
341
|
+
eventName = 'tap';
|
|
342
|
+
}
|
|
343
|
+
if (shared.isFunction(value)) {
|
|
344
|
+
if (oldValue) {
|
|
345
|
+
dom.removeEventListener(eventName, oldValue, false);
|
|
346
|
+
dom.addEventListener(eventName, value, { isCapture: isCapture, sideEffect: false });
|
|
347
|
+
}
|
|
348
|
+
else {
|
|
349
|
+
dom.addEventListener(eventName, value, isCapture);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
dom.removeEventListener(eventName, oldValue);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function setStyle(style, key, value) {
|
|
357
|
+
if (key[0] === '-') {
|
|
358
|
+
style.setProperty(key, value.toString());
|
|
359
|
+
// css variables need not further judgment
|
|
360
|
+
return;
|
|
361
|
+
}
|
|
362
|
+
style[key] =
|
|
363
|
+
shared.isNumber(value) && IS_NON_DIMENSIONAL.test(key) === false
|
|
364
|
+
? value + 'px'
|
|
365
|
+
: value == null
|
|
366
|
+
? ''
|
|
367
|
+
: value;
|
|
368
|
+
}
|
|
369
|
+
function setProperty(dom, name, value, oldValue) {
|
|
370
|
+
var _a, _b;
|
|
371
|
+
name = name === 'className' ? 'class' : name;
|
|
372
|
+
if (name === 'key' ||
|
|
373
|
+
name === 'children' ||
|
|
374
|
+
name === 'ref') ;
|
|
375
|
+
else if (name === 'style') {
|
|
376
|
+
var style = dom.style;
|
|
377
|
+
if (shared.isString(value)) {
|
|
378
|
+
style.cssText = value;
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
if (shared.isString(oldValue)) {
|
|
382
|
+
style.cssText = '';
|
|
383
|
+
oldValue = null;
|
|
384
|
+
}
|
|
385
|
+
if (shared.isObject(oldValue)) {
|
|
386
|
+
for (var i in oldValue) {
|
|
387
|
+
if (!(value && i in value)) {
|
|
388
|
+
setStyle(style, i, '');
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
if (shared.isObject(value)) {
|
|
393
|
+
for (var i$1 in value) {
|
|
394
|
+
if (!oldValue || value[i$1] !== oldValue[i$1]) {
|
|
395
|
+
setStyle(style, i$1, value[i$1]);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
else if (isEventName(name)) {
|
|
402
|
+
setEvent(dom, name, value, oldValue);
|
|
403
|
+
}
|
|
404
|
+
else if (name === 'dangerouslySetInnerHTML') {
|
|
405
|
+
var newHtml = (_a = value === null || value === void 0 ? void 0 : value.__html) !== null && _a !== void 0 ? _a : '';
|
|
406
|
+
var oldHtml = (_b = oldValue === null || oldValue === void 0 ? void 0 : oldValue.__html) !== null && _b !== void 0 ? _b : '';
|
|
407
|
+
if (newHtml || oldHtml) {
|
|
408
|
+
if (oldHtml !== newHtml) {
|
|
409
|
+
dom.innerHTML = newHtml;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
else if (!shared.isFunction(value)) {
|
|
414
|
+
if (value == null) {
|
|
415
|
+
dom.removeAttribute(name);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
dom.setAttribute(name, value);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/* eslint-disable @typescript-eslint/indent */
|
|
424
|
+
var hostConfig = {
|
|
425
|
+
// below keys order by {React ReactFiberHostConfig.custom.js}, convenient for comparing each other.
|
|
426
|
+
// -------------------
|
|
427
|
+
// required by @types/react-reconciler
|
|
428
|
+
// -------------------
|
|
429
|
+
getPublicInstance: function getPublicInstance(inst) {
|
|
430
|
+
return inst;
|
|
431
|
+
},
|
|
432
|
+
getRootHostContext: function getRootHostContext() {
|
|
433
|
+
return {};
|
|
434
|
+
},
|
|
435
|
+
getChildHostContext: function getChildHostContext(parentHostContext) {
|
|
436
|
+
return parentHostContext;
|
|
437
|
+
},
|
|
438
|
+
prepareForCommit: function prepareForCommit() {
|
|
439
|
+
|
|
440
|
+
return null;
|
|
441
|
+
},
|
|
442
|
+
resetAfterCommit: shared.noop,
|
|
443
|
+
createInstance: function createInstance(type, props, _rootContainerInstance, _hostContext, internalInstanceHandle) {
|
|
444
|
+
var element = runtime.document.createElement(type);
|
|
445
|
+
precacheFiberNode(internalInstanceHandle, element);
|
|
446
|
+
updateFiberProps(element, props);
|
|
447
|
+
return element;
|
|
448
|
+
},
|
|
449
|
+
appendInitialChild: function appendInitialChild(parent, child) {
|
|
450
|
+
parent.appendChild(child);
|
|
451
|
+
},
|
|
452
|
+
finalizeInitialChildren: function finalizeInitialChildren(dom, type, props) {
|
|
453
|
+
var obj;
|
|
454
|
+
|
|
455
|
+
var newProps = props;
|
|
456
|
+
if (dom instanceof runtime.FormElement) {
|
|
457
|
+
var ref = ['switch', 'checkbox', 'radio'].includes(type) ? ['checked', 'defaultChecked'] : ['value', 'defaultValue'];
|
|
458
|
+
var defaultName = ref[0];
|
|
459
|
+
var defaultKey = ref[1];
|
|
460
|
+
if (props.hasOwnProperty(defaultKey)) {
|
|
461
|
+
newProps = Object.assign(Object.assign({}, newProps), ( obj = {}, obj[defaultName] = props[defaultKey], obj ));
|
|
462
|
+
delete newProps[defaultKey];
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
updateProps(dom, {}, newProps); // 提前执行更新属性操作,Taro 在 Page 初始化后会立即从 dom 读取必要信息
|
|
466
|
+
if (type === 'input' || type === 'textarea') {
|
|
467
|
+
track(dom);
|
|
468
|
+
}
|
|
469
|
+
return false;
|
|
470
|
+
},
|
|
471
|
+
prepareUpdate: function prepareUpdate(instance, _, oldProps, newProps) {
|
|
472
|
+
return getUpdatePayload(instance, oldProps, newProps);
|
|
473
|
+
},
|
|
474
|
+
shouldSetTextContent: function shouldSetTextContent() {
|
|
475
|
+
return false;
|
|
476
|
+
},
|
|
477
|
+
createTextInstance: function createTextInstance(text, _rootContainerInstance, _hostContext, internalInstanceHandle) {
|
|
478
|
+
var textNode = runtime.document.createTextNode(text);
|
|
479
|
+
precacheFiberNode(internalInstanceHandle, textNode);
|
|
480
|
+
return textNode;
|
|
481
|
+
},
|
|
482
|
+
scheduleTimeout: setTimeout,
|
|
483
|
+
cancelTimeout: clearTimeout,
|
|
484
|
+
noTimeout: -1,
|
|
485
|
+
isPrimaryRenderer: true,
|
|
486
|
+
warnsIfNotActing: true,
|
|
487
|
+
supportsMutation: true,
|
|
488
|
+
supportsPersistence: false,
|
|
489
|
+
supportsHydration: false,
|
|
490
|
+
getInstanceFromNode: function () { return null; },
|
|
491
|
+
beforeActiveInstanceBlur: shared.noop,
|
|
492
|
+
afterActiveInstanceBlur: shared.noop,
|
|
493
|
+
preparePortalMount: shared.noop,
|
|
494
|
+
prepareScopeUpdate: shared.noop,
|
|
495
|
+
getInstanceFromScope: function () { return null; },
|
|
496
|
+
getCurrentEventPriority: function getCurrentEventPriority() {
|
|
497
|
+
return constants.DefaultEventPriority;
|
|
498
|
+
},
|
|
499
|
+
detachDeletedInstance: shared.noop,
|
|
500
|
+
// -------------------
|
|
501
|
+
// Microtasks
|
|
502
|
+
// (optional)
|
|
503
|
+
// -------------------
|
|
504
|
+
supportsMicrotasks: true,
|
|
505
|
+
scheduleMicrotask: shared.isUndefined(Promise)
|
|
506
|
+
? setTimeout
|
|
507
|
+
: function (callback) { return Promise.resolve(null)
|
|
508
|
+
.then(callback)
|
|
509
|
+
.catch(function (error) {
|
|
510
|
+
setTimeout(function () {
|
|
511
|
+
throw error;
|
|
512
|
+
});
|
|
513
|
+
}); },
|
|
514
|
+
// -------------------
|
|
515
|
+
// Mutation
|
|
516
|
+
// (required if supportsMutation is true)
|
|
517
|
+
// -------------------
|
|
518
|
+
appendChild: function appendChild(parent, child) {
|
|
519
|
+
parent.appendChild(child);
|
|
520
|
+
},
|
|
521
|
+
appendChildToContainer: function appendChildToContainer(parent, child) {
|
|
522
|
+
parent.appendChild(child);
|
|
523
|
+
},
|
|
524
|
+
commitTextUpdate: function commitTextUpdate(textInst, _, newText) {
|
|
525
|
+
textInst.nodeValue = newText;
|
|
526
|
+
},
|
|
527
|
+
commitMount: shared.noop,
|
|
528
|
+
commitUpdate: function commitUpdate(dom, updatePayload, _, oldProps, newProps) {
|
|
529
|
+
updatePropsByPayload(dom, oldProps, updatePayload);
|
|
530
|
+
updateFiberProps(dom, newProps);
|
|
531
|
+
},
|
|
532
|
+
insertBefore: function insertBefore(parent, child, refChild) {
|
|
533
|
+
parent.insertBefore(child, refChild);
|
|
534
|
+
},
|
|
535
|
+
insertInContainerBefore: function insertInContainerBefore(parent, child, refChild) {
|
|
536
|
+
parent.insertBefore(child, refChild);
|
|
537
|
+
},
|
|
538
|
+
removeChild: function removeChild(parent, child) {
|
|
539
|
+
parent.removeChild(child);
|
|
540
|
+
},
|
|
541
|
+
removeChildFromContainer: function removeChildFromContainer(parent, child) {
|
|
542
|
+
parent.removeChild(child);
|
|
543
|
+
},
|
|
544
|
+
resetTextContent: shared.noop,
|
|
545
|
+
hideInstance: function hideInstance(instance) {
|
|
546
|
+
var style = instance.style;
|
|
547
|
+
style.setProperty('display', 'none');
|
|
548
|
+
},
|
|
549
|
+
hideTextInstance: function hideTextInstance(textInstance) {
|
|
550
|
+
textInstance.nodeValue = '';
|
|
551
|
+
},
|
|
552
|
+
unhideInstance: function unhideInstance(instance, props) {
|
|
553
|
+
var styleProp = props.style;
|
|
554
|
+
var display = (styleProp === null || styleProp === void 0 ? void 0 : styleProp.hasOwnProperty('display')) ? styleProp.display : null;
|
|
555
|
+
display = display == null || shared.isBoolean(display) || display === '' ? '' : ('' + display).trim();
|
|
556
|
+
// eslint-disable-next-line dot-notation
|
|
557
|
+
instance.style['display'] = display;
|
|
558
|
+
},
|
|
559
|
+
unhideTextInstance: function unhideTextInstance(textInstance, text) {
|
|
560
|
+
textInstance.nodeValue = text;
|
|
561
|
+
},
|
|
562
|
+
clearContainer: function clearContainer(element) {
|
|
563
|
+
if (element.childNodes.length > 0) {
|
|
564
|
+
element.textContent = '';
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
};
|
|
568
|
+
var TaroReconciler = Reconciler__default["default"](hostConfig);
|
|
569
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
570
|
+
var foundDevTools = TaroReconciler.injectIntoDevTools({
|
|
571
|
+
bundleType: 1,
|
|
572
|
+
version: '18.0.0',
|
|
573
|
+
rendererPackageName: 'taro-react'
|
|
574
|
+
});
|
|
575
|
+
if (!foundDevTools) {
|
|
576
|
+
// eslint-disable-next-line no-console
|
|
577
|
+
console.info('%cDownload the React DevTools ' +
|
|
578
|
+
'for a better development experience: ' +
|
|
579
|
+
'https://reactjs.org/link/react-devtools', 'font-weight:bold');
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
var restoreQueue = null;
|
|
584
|
+
// 对比 TaroElement tracker 下的 value 和事件下的 value,判断 element 的值是否存在更改
|
|
585
|
+
function getTargetInstForInputOrChangeEvent(e, node) {
|
|
586
|
+
var _a, _b;
|
|
587
|
+
var targetInst = getInstanceFromNode(node);
|
|
588
|
+
var domEventName = e.type;
|
|
589
|
+
if (!targetInst || !isTextInputElement(node))
|
|
590
|
+
{ return; }
|
|
591
|
+
if (domEventName === 'input' || domEventName === 'change') {
|
|
592
|
+
var nextValue = toString((_b = (_a = e.mpEvent) === null || _a === void 0 ? void 0 : _a.detail) === null || _b === void 0 ? void 0 : _b.value);
|
|
593
|
+
return getInstIfValueChanged(targetInst, nextValue);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
function getInstIfValueChanged(targetInst, nextValue) {
|
|
597
|
+
var targetNode = getNodeFromInstance(targetInst);
|
|
598
|
+
if (!targetNode)
|
|
599
|
+
{ return false; }
|
|
600
|
+
if (updateValueIfChanged(targetNode, nextValue)) {
|
|
601
|
+
return targetInst;
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
// 把 target 塞入更新队列中
|
|
605
|
+
function enqueueStateRestore(target) {
|
|
606
|
+
if (restoreQueue) {
|
|
607
|
+
restoreQueue.push(target);
|
|
608
|
+
}
|
|
609
|
+
else {
|
|
610
|
+
restoreQueue = [target];
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
// 判断是否需要恢复 target(input、textarea) 的状态
|
|
614
|
+
function needsStateRestore() {
|
|
615
|
+
return restoreQueue !== null;
|
|
616
|
+
}
|
|
617
|
+
function finishEventHandler() {
|
|
618
|
+
var controlledComponentsHavePendingUpdates = needsStateRestore();
|
|
619
|
+
if (controlledComponentsHavePendingUpdates) {
|
|
620
|
+
TaroReconciler.flushSync();
|
|
621
|
+
restoreStateIfNeeded();
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
// 遍历 restoreQueue、restoreTarget,恢复其状态
|
|
625
|
+
function restoreStateIfNeeded() {
|
|
626
|
+
if (!restoreQueue) {
|
|
627
|
+
return;
|
|
628
|
+
}
|
|
629
|
+
var queuedTargets = restoreQueue;
|
|
630
|
+
restoreQueue = null;
|
|
631
|
+
for (var i = 0; i < queuedTargets.length; i++) {
|
|
632
|
+
restoreStateOfTarget(queuedTargets[i]);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
function restoreImpl(domElement, tag, oldValue, props) {
|
|
636
|
+
switch (tag) {
|
|
637
|
+
case 'input':
|
|
638
|
+
ReactDOMInputRestoreControlledState(domElement, oldValue, props);
|
|
639
|
+
break;
|
|
640
|
+
case 'textarea':
|
|
641
|
+
ReactDOMTextareaRestoreControlledState(domElement, oldValue, props);
|
|
642
|
+
break;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
function restoreStateOfTarget(item) {
|
|
646
|
+
var internalInstance = getInstanceFromNode(item.target);
|
|
647
|
+
if (!internalInstance)
|
|
648
|
+
{ return; }
|
|
649
|
+
var stateNode = internalInstance.stateNode;
|
|
650
|
+
var type = internalInstance.type;
|
|
651
|
+
if (stateNode) {
|
|
652
|
+
var props = getFiberCurrentPropsFromNode(stateNode);
|
|
653
|
+
restoreImpl(stateNode, type, item.value, props);
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
var ContainerMap = new WeakMap();
|
|
658
|
+
var Root = function Root(renderer, domContainer, options) {
|
|
659
|
+
this.renderer = renderer;
|
|
660
|
+
this.initInternalRoot(renderer, domContainer, options);
|
|
661
|
+
};
|
|
662
|
+
Root.prototype.initInternalRoot = function initInternalRoot (renderer, domContainer, options) {
|
|
663
|
+
// Since react-reconciler v0.27, createContainer need more parameters
|
|
664
|
+
// @see:https://github.com/facebook/react/blob/0b974418c9a56f6c560298560265dcf4b65784bc/packages/react-reconciler/src/ReactFiberReconciler.js#L248
|
|
665
|
+
var containerInfo = domContainer;
|
|
666
|
+
if (options) {
|
|
667
|
+
var tag = 1; // ConcurrentRoot
|
|
668
|
+
var concurrentUpdatesByDefaultOverride = false;
|
|
669
|
+
var isStrictMode = false;
|
|
670
|
+
var identifierPrefix = '';
|
|
671
|
+
var onRecoverableError = function (error) { return console.error(error); };
|
|
672
|
+
var transitionCallbacks = null;
|
|
673
|
+
if (options.unstable_strictMode === true) {
|
|
674
|
+
isStrictMode = true;
|
|
675
|
+
}
|
|
676
|
+
if (options.identifierPrefix !== undefined) {
|
|
677
|
+
identifierPrefix = options.identifierPrefix;
|
|
678
|
+
}
|
|
679
|
+
if (options.onRecoverableError !== undefined) {
|
|
680
|
+
onRecoverableError = options.onRecoverableError;
|
|
681
|
+
}
|
|
682
|
+
if (options.unstable_transitionCallbacks !== undefined) {
|
|
683
|
+
transitionCallbacks = options.unstable_transitionCallbacks;
|
|
684
|
+
}
|
|
685
|
+
this.internalRoot = renderer.createContainer(containerInfo, tag, null, // hydrationCallbacks
|
|
686
|
+
isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks);
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
var tag$1 = 0; // LegacyRoot
|
|
690
|
+
this.internalRoot = renderer.createContainer(containerInfo, tag$1, null, // hydrationCallbacks
|
|
691
|
+
false, // isStrictMode
|
|
692
|
+
false, // concurrentUpdatesByDefaultOverride,
|
|
693
|
+
'', // identifierPrefix
|
|
694
|
+
function () { }, // onRecoverableError, this isn't reachable because onRecoverableError isn't called in the legacy API.
|
|
695
|
+
null // transitionCallbacks
|
|
696
|
+
);
|
|
697
|
+
}
|
|
698
|
+
};
|
|
699
|
+
Root.prototype.render = function render (children, cb) {
|
|
700
|
+
var ref = this;
|
|
701
|
+
var renderer = ref.renderer;
|
|
702
|
+
var internalRoot = ref.internalRoot;
|
|
703
|
+
renderer.updateContainer(children, internalRoot, null, cb);
|
|
704
|
+
return renderer.getPublicRootInstance(internalRoot);
|
|
705
|
+
};
|
|
706
|
+
Root.prototype.unmount = function unmount (cb) {
|
|
707
|
+
this.renderer.updateContainer(null, this.internalRoot, null, cb);
|
|
708
|
+
};
|
|
709
|
+
function render(element, domContainer, cb) {
|
|
710
|
+
var oldRoot = ContainerMap.get(domContainer);
|
|
711
|
+
if (oldRoot != null) {
|
|
712
|
+
return oldRoot.render(element, cb);
|
|
713
|
+
}
|
|
714
|
+
var root = new Root(TaroReconciler, domContainer);
|
|
715
|
+
ContainerMap.set(domContainer, root);
|
|
716
|
+
return root.render(element, cb);
|
|
717
|
+
}
|
|
718
|
+
function createRoot(domContainer, options) {
|
|
719
|
+
if ( options === void 0 ) options = {};
|
|
720
|
+
|
|
721
|
+
var _a;
|
|
722
|
+
var oldRoot = ContainerMap.get(domContainer);
|
|
723
|
+
if (oldRoot != null) {
|
|
724
|
+
return oldRoot;
|
|
725
|
+
}
|
|
726
|
+
// options should be an object
|
|
727
|
+
var root = new Root(TaroReconciler, domContainer, options);
|
|
728
|
+
ContainerMap.set(domContainer, root);
|
|
729
|
+
markContainerAsRoot((_a = root === null || root === void 0 ? void 0 : root.internalRoot) === null || _a === void 0 ? void 0 : _a.current, domContainer);
|
|
730
|
+
runtime.hooks.tap('dispatchTaroEvent', function (e, node) {
|
|
731
|
+
var eventPriority = getEventPriority(e.type);
|
|
732
|
+
TaroReconciler.runWithPriority(eventPriority, function () {
|
|
733
|
+
node.dispatchEvent(e);
|
|
734
|
+
});
|
|
735
|
+
});
|
|
736
|
+
// 对比 event.detail.value 和 node.tracker.value,判断 value 值是否有变动,存在变动则塞入队列中
|
|
737
|
+
runtime.hooks.tap('modifyTaroEvent', function (e, node) {
|
|
738
|
+
var _a, _b;
|
|
739
|
+
var inst = getTargetInstForInputOrChangeEvent(e, node);
|
|
740
|
+
if (!inst)
|
|
741
|
+
{ return; }
|
|
742
|
+
// 这里塞入的是 event.detail.value,也就是事件的值,在受控组件中,你可以理解为需要被变更的值
|
|
743
|
+
// 后续会在 finishEventHandler 中,使用最新的 fiber.props.value 来与其比较
|
|
744
|
+
// 如果不一致,则表示需要更新,会执行 node.value = fiber.props.value 的更新操作
|
|
745
|
+
var nextValue = (_b = (_a = e.mpEvent) === null || _a === void 0 ? void 0 : _a.detail) === null || _b === void 0 ? void 0 : _b.value;
|
|
746
|
+
enqueueStateRestore({ target: node, value: nextValue });
|
|
747
|
+
});
|
|
748
|
+
return root;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
var isInsideEventHandler = false;
|
|
752
|
+
// 重新包裹 batchedUpdates,使其可以在触发事件后执行 finishEventHandler
|
|
753
|
+
var unstable_batchedUpdates = function (fn, a) {
|
|
754
|
+
if (isInsideEventHandler) {
|
|
755
|
+
return fn(a);
|
|
756
|
+
}
|
|
757
|
+
isInsideEventHandler = true;
|
|
758
|
+
try {
|
|
759
|
+
return TaroReconciler.batchedUpdates(fn, a);
|
|
760
|
+
}
|
|
761
|
+
finally {
|
|
762
|
+
isInsideEventHandler = false;
|
|
763
|
+
finishEventHandler();
|
|
764
|
+
}
|
|
765
|
+
};
|
|
766
|
+
function unmountComponentAtNode(dom) {
|
|
767
|
+
shared.ensure(dom && [1, 8, 9, 11].includes(dom.nodeType), 'unmountComponentAtNode(...): Target container is not a DOM element.');
|
|
768
|
+
var root = ContainerMap.get(dom);
|
|
769
|
+
if (!root)
|
|
770
|
+
{ return false; }
|
|
771
|
+
unstable_batchedUpdates(function () {
|
|
772
|
+
root.unmount(function () {
|
|
773
|
+
ContainerMap.delete(dom);
|
|
774
|
+
});
|
|
775
|
+
}, null);
|
|
776
|
+
return true;
|
|
777
|
+
}
|
|
778
|
+
function findDOMNode(comp) {
|
|
779
|
+
if (comp == null) {
|
|
780
|
+
return null;
|
|
781
|
+
}
|
|
782
|
+
var nodeType = comp.nodeType;
|
|
783
|
+
if (nodeType === 1 || nodeType === 3) {
|
|
784
|
+
return comp;
|
|
785
|
+
}
|
|
786
|
+
return TaroReconciler.findHostInstance(comp);
|
|
787
|
+
}
|
|
788
|
+
var portalType = shared.isFunction(Symbol) && Symbol.for
|
|
789
|
+
? Symbol.for('react.portal')
|
|
790
|
+
: 0xeaca;
|
|
791
|
+
function createPortal(children, containerInfo, key) {
|
|
792
|
+
return {
|
|
793
|
+
$$typeof: portalType,
|
|
794
|
+
key: key == null ? null : String(key),
|
|
795
|
+
children: children,
|
|
796
|
+
containerInfo: containerInfo,
|
|
797
|
+
implementation: null
|
|
798
|
+
};
|
|
799
|
+
}
|
|
800
|
+
var index = {
|
|
801
|
+
render: render,
|
|
802
|
+
createRoot: createRoot,
|
|
803
|
+
unstable_batchedUpdates: unstable_batchedUpdates,
|
|
804
|
+
unmountComponentAtNode: unmountComponentAtNode,
|
|
805
|
+
findDOMNode: findDOMNode,
|
|
806
|
+
createPortal: createPortal
|
|
807
|
+
};
|
|
808
|
+
|
|
809
|
+
exports.createPortal = createPortal;
|
|
810
|
+
exports.createRoot = createRoot;
|
|
811
|
+
exports["default"] = index;
|
|
812
|
+
exports.findDOMNode = findDOMNode;
|
|
813
|
+
exports.render = render;
|
|
814
|
+
exports.unmountComponentAtNode = unmountComponentAtNode;
|
|
815
|
+
exports.unstable_batchedUpdates = unstable_batchedUpdates;
|
|
816
|
+
//# sourceMappingURL=index.js.map
|