vnode.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import _typeof from "@babel/runtime/helpers/esm/typeof";
  2. import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
  3. import { filterEmpty } from './props-util';
  4. import { cloneVNode } from 'vue';
  5. import warning from './warning';
  6. export function cloneElement(vnode) {
  7. var nodeProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  8. var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  9. var mergeRef = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  10. var ele = vnode;
  11. if (Array.isArray(vnode)) {
  12. ele = filterEmpty(vnode)[0];
  13. }
  14. if (!ele) {
  15. return null;
  16. }
  17. var node = cloneVNode(ele, nodeProps, mergeRef);
  18. // cloneVNode内部是合并属性,这里改成覆盖属性
  19. node.props = override ? _objectSpread(_objectSpread({}, node.props), nodeProps) : node.props;
  20. warning(_typeof(node.props.class) !== 'object', 'class must be string');
  21. return node;
  22. }
  23. export function cloneVNodes(vnodes) {
  24. var nodeProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  25. var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  26. return vnodes.map(function (vnode) {
  27. return cloneElement(vnode, nodeProps, override);
  28. });
  29. }
  30. export function deepCloneElement(vnode) {
  31. var nodeProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  32. var override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  33. var mergeRef = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  34. if (Array.isArray(vnode)) {
  35. return vnode.map(function (item) {
  36. return deepCloneElement(item, nodeProps, override, mergeRef);
  37. });
  38. } else {
  39. var cloned = cloneElement(vnode, nodeProps, override, mergeRef);
  40. if (Array.isArray(cloned.children)) {
  41. cloned.children = deepCloneElement(cloned.children);
  42. }
  43. return cloned;
  44. }
  45. }