@antv/f2
Version:
Charts for mobile visualization.
93 lines • 2.57 kB
JavaScript
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import { isArray, isNil } from '@antv/util';
function cloneElement(element, props) {
if (!element) return element;
return _objectSpread(_objectSpread({}, element), {}, {
props: _objectSpread(_objectSpread({}, element.props), props)
});
}
function map(children, fn) {
if (!children) {
return fn(children);
}
if (isArray(children)) {
return children.map(function (child) {
return map(child, fn);
});
}
return fn(children);
}
function compareArray(nextElements, lastElements, callback) {
var keyed = {};
var nextLength = nextElements.length;
var lastLength = lastElements.length;
for (var i = 0, len = lastLength; i < len; i++) {
var element = lastElements[i];
if (element && !isNil(element.key)) {
var key = element.key;
keyed[key] = element;
}
}
// 比较元素
for (var _i = 0, _len = Math.max(nextLength, lastLength); _i < _len; _i++) {
var _element = nextElements[_i];
if (!_element) {
compare(_element, lastElements[_i], callback);
continue;
}
var _key = _element.key;
// 有key值定义
if (!isNil(_element.key)) {
var lastElement = keyed[_key];
if (lastElement) delete keyed[_key];
compare(_element, lastElement, callback);
continue;
}
compare(_element, lastElements[_i], callback);
}
// 说明是删除的元素
Object.keys(keyed).forEach(function (key) {
compare(null, keyed[key], callback);
});
}
// 比较2棵树
function compare(nextElement, lastElement, callback) {
// 有一个为空
if (!nextElement || !lastElement) {
callback(nextElement, lastElement);
return;
}
if (isArray(nextElement) || isArray(lastElement)) {
var nextElementArray = isArray(nextElement) ? nextElement : [nextElement];
var lastElementArray = isArray(lastElement) ? lastElement : [lastElement];
compareArray(nextElementArray, lastElementArray, callback);
return;
}
callback(nextElement, lastElement);
}
function toArray(element) {
if (!element) {
return element;
}
if (!isArray(element)) {
return [element];
}
var newArray = [];
for (var i = 0, len = element.length; i < len; i++) {
var item = element[i];
if (isArray(item)) {
// @ts-ignore
newArray = newArray.concat(toArray(item));
} else {
newArray.push(item);
}
}
return newArray;
}
var Children = {
cloneElement: cloneElement,
map: map,
toArray: toArray,
compare: compare
};
export default Children;