vnode.js 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.cloneElement = cloneElement;
  7. exports.cloneVNodes = cloneVNodes;
  8. exports.customRenderSlot = customRenderSlot;
  9. exports.deepCloneElement = deepCloneElement;
  10. exports.triggerVNodeUpdate = triggerVNodeUpdate;
  11. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  12. var _propsUtil = require("./props-util");
  13. var _vue = require("vue");
  14. var _warning = _interopRequireDefault(require("./warning"));
  15. function cloneElement(vnode) {
  16. let nodeProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  17. let override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  18. let mergeRef = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  19. let ele = vnode;
  20. if (Array.isArray(vnode)) {
  21. ele = (0, _propsUtil.filterEmpty)(vnode)[0];
  22. }
  23. if (!ele) {
  24. return null;
  25. }
  26. const node = (0, _vue.cloneVNode)(ele, nodeProps, mergeRef);
  27. // cloneVNode内部是合并属性,这里改成覆盖属性
  28. node.props = override ? (0, _extends2.default)((0, _extends2.default)({}, node.props), nodeProps) : node.props;
  29. (0, _warning.default)(typeof node.props.class !== 'object', 'class must be string');
  30. return node;
  31. }
  32. function cloneVNodes(vnodes) {
  33. let nodeProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  34. let override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  35. return vnodes.map(vnode => cloneElement(vnode, nodeProps, override));
  36. }
  37. function deepCloneElement(vnode) {
  38. let nodeProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
  39. let override = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
  40. let mergeRef = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
  41. if (Array.isArray(vnode)) {
  42. return vnode.map(item => deepCloneElement(item, nodeProps, override, mergeRef));
  43. } else {
  44. // 需要判断是否为vnode方可进行clone操作
  45. if (!(0, _vue.isVNode)(vnode)) {
  46. return vnode;
  47. }
  48. const cloned = cloneElement(vnode, nodeProps, override, mergeRef);
  49. if (Array.isArray(cloned.children)) {
  50. cloned.children = deepCloneElement(cloned.children);
  51. }
  52. return cloned;
  53. }
  54. }
  55. function triggerVNodeUpdate(vm, attrs, dom) {
  56. (0, _vue.render)((0, _vue.cloneVNode)(vm, (0, _extends2.default)({}, attrs)), dom);
  57. }
  58. const ensureValidVNode = slot => {
  59. return (slot || []).some(child => {
  60. if (!(0, _vue.isVNode)(child)) return true;
  61. if (child.type === _vue.Comment) return false;
  62. if (child.type === _vue.Fragment && !ensureValidVNode(child.children)) return false;
  63. return true;
  64. }) ? slot : null;
  65. };
  66. function customRenderSlot(slots, name, props, fallback) {
  67. var _a;
  68. const slot = (_a = slots[name]) === null || _a === void 0 ? void 0 : _a.call(slots, props);
  69. if (ensureValidVNode(slot)) {
  70. return slot;
  71. }
  72. return fallback === null || fallback === void 0 ? void 0 : fallback();
  73. }