UNPKG

2.58 kBJavaScriptView Raw
1import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
2import { isArray, isNil } from '@antv/util';
3
4function cloneElement(element, props) {
5 if (!element) return element;
6 return _objectSpread(_objectSpread({}, element), {}, {
7 props: _objectSpread(_objectSpread({}, element.props), props)
8 });
9}
10
11function map(children, fn) {
12 if (!children) {
13 return fn(children);
14 }
15
16 if (isArray(children)) {
17 return children.map(function (child) {
18 return map(child, fn);
19 });
20 }
21
22 return fn(children);
23}
24
25function compareArray(nextElements, lastElements, callback) {
26 var keyed = {};
27 var nextLength = nextElements.length;
28 var lastLength = lastElements.length;
29
30 for (var i = 0, len = lastLength; i < len; i++) {
31 var element = lastElements[i];
32
33 if (element && !isNil(element.key)) {
34 var key = element.key;
35 keyed[key] = element;
36 }
37 } // 比较元素
38
39
40 for (var _i = 0, _len = Math.max(nextLength, lastLength); _i < _len; _i++) {
41 var _element = nextElements[_i];
42
43 if (!_element) {
44 compare(_element, lastElements[_i], callback);
45 continue;
46 }
47
48 var _key = _element.key; // 有key值定义
49
50 if (!isNil(_element.key)) {
51 var lastElement = keyed[_key];
52 if (lastElement) delete keyed[_key];
53 compare(_element, lastElement, callback);
54 continue;
55 }
56
57 compare(_element, lastElements[_i], callback);
58 } // 说明是删除的元素
59
60
61 Object.keys(keyed).forEach(function (key) {
62 compare(null, keyed[key], callback);
63 });
64} // 比较2棵树
65
66
67function compare(nextElement, lastElement, callback) {
68 // 有一个为空
69 if (!nextElement || !lastElement) {
70 callback(nextElement, lastElement);
71 return;
72 }
73
74 if (isArray(nextElement) || isArray(lastElement)) {
75 var nextElementArray = isArray(nextElement) ? nextElement : [nextElement];
76 var lastElementArray = isArray(lastElement) ? lastElement : [lastElement];
77 compareArray(nextElementArray, lastElementArray, callback);
78 return;
79 }
80
81 callback(nextElement, lastElement);
82}
83
84function toArray(element) {
85 if (!element) {
86 return element;
87 }
88
89 if (!isArray(element)) {
90 return [element];
91 }
92
93 var newArray = [];
94
95 for (var i = 0, len = element.length; i < len; i++) {
96 var item = element[i];
97
98 if (isArray(item)) {
99 // @ts-ignore
100 newArray = newArray.concat(toArray(item));
101 } else {
102 newArray.push(item);
103 }
104 }
105
106 return newArray;
107}
108
109var Children = {
110 cloneElement: cloneElement,
111 map: map,
112 toArray: toArray,
113 compare: compare
114};
115export default Children;
\No newline at end of file