@antv/f-engine
Version: 
FEngine 是 AntV F 系列可视化引擎的底层渲染引擎,为移动端提供了一套完整的渲染、事件、动画能力,能方便的构建可视化 UI
119 lines (118 loc) • 3.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = void 0;
var _tslib = require("tslib");
var _util = require("@antv/util");
function cloneElement(element, props) {
  if (!element) return element;
  return (0, _tslib.__assign)((0, _tslib.__assign)({}, element), {
    props: (0, _tslib.__assign)((0, _tslib.__assign)({}, element.props), props)
  });
}
function map(children, fn) {
  if (!children) {
    return fn(children);
  }
  if ((0, _util.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 && !(0, _util.isNil)(element.key)) {
      var key = element.key;
      keyed[key] = element;
    }
  }
  var result = [];
  // 比较元素
  for (var i = 0, len = nextLength; i < len; i++) {
    var element = nextElements[i];
    if (!element) {
      continue;
    }
    var key = element.key;
    var lastElement = void 0;
    // 有key值定义
    if (!(0, _util.isNil)(element.key)) {
      lastElement = keyed[key];
      if (lastElement) delete keyed[key];
    } else {
      // 取相同位置的元素
      lastElement = lastElements[i];
    }
    // 没有直接返回
    if (!lastElement) {
      result.push(compare(element, null, callback));
      continue;
    }
    // 如果 lastElement 已经被处理过, next 处理成新增
    if (lastElement === null || lastElement === void 0 ? void 0 : lastElement.__processed) {
      result.push(compare(element, null, callback));
      continue;
    }
    // 标记 element 已经被处理过
    lastElement.__processed = true;
    result.push(compare(element, lastElement, callback));
  }
  // 处理 lastElements 里面还未被处理的元素
  for (var i = 0, len = lastLength; i < len; i++) {
    var lastElement = lastElements[i];
    if (!lastElement) {
      continue;
    }
    if (!(lastElement === null || lastElement === void 0 ? void 0 : lastElement.__processed)) {
      result.push(compare(null, lastElement, callback));
    } else {
      delete lastElement.__processed;
    }
  }
  return result;
}
// 比较2棵树
function compare(nextElement, lastElement, callback) {
  // 有一个为空
  if (!nextElement || !lastElement) {
    return callback(nextElement, lastElement);
  }
  if ((0, _util.isArray)(nextElement) || (0, _util.isArray)(lastElement)) {
    var nextElementArray = (0, _util.isArray)(nextElement) ? nextElement : [nextElement];
    var lastElementArray = (0, _util.isArray)(lastElement) ? lastElement : [lastElement];
    return compareArray(nextElementArray, lastElementArray, callback);
  }
  return callback(nextElement, lastElement);
}
function toArray(element) {
  if (!element) {
    return element;
  }
  if (!(0, _util.isArray)(element)) {
    return [element];
  }
  var newArray = [];
  for (var i = 0, len = element.length; i < len; i++) {
    var item = element[i];
    if ((0, _util.isArray)(item)) {
      newArray = newArray.concat(toArray(item));
    } else {
      newArray.push(item);
    }
  }
  return newArray;
}
var Children = {
  cloneElement: cloneElement,
  map: map,
  toArray: toArray,
  compare: compare
};
var _default = exports.default = Children;