2e77c017092f2721c7f451e72a85d0000c70f9293ff0a89d28214a72acfdfcf2e4d4523bbda51e888fdc8c1a45e7dbc207ab45330162089d17af98c0b94774 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. const getHtmlElementFromNode = ({ el }) => el;
  2. const addContext = (domElement, context) =>
  3. (domElement.__draggable_context = context);
  4. const getContext = domElement => domElement.__draggable_context;
  5. class ComponentStructure {
  6. constructor({
  7. nodes: { header, default: defaultNodes, footer },
  8. root,
  9. realList
  10. }) {
  11. this.defaultNodes = defaultNodes;
  12. this.children = [...header, ...defaultNodes, ...footer];
  13. this.externalComponent = root.externalComponent;
  14. this.rootTransition = root.transition;
  15. this.tag = root.tag;
  16. this.realList = realList;
  17. }
  18. get _isRootComponent() {
  19. return this.externalComponent || this.rootTransition;
  20. }
  21. render(h, attributes) {
  22. const { tag, children, _isRootComponent } = this;
  23. const option = !_isRootComponent ? children : { default: () => children };
  24. return h(tag, attributes, option);
  25. }
  26. updated() {
  27. const { defaultNodes, realList } = this;
  28. defaultNodes.forEach((node, index) => {
  29. addContext(getHtmlElementFromNode(node), {
  30. element: realList[index],
  31. index
  32. });
  33. });
  34. }
  35. getUnderlyingVm(domElement) {
  36. return getContext(domElement);
  37. }
  38. getVmIndexFromDomIndex(domIndex, element) {
  39. const { defaultNodes } = this;
  40. const { length } = defaultNodes;
  41. const domChildren = element.children;
  42. const domElement = domChildren.item(domIndex);
  43. if (domElement === null) {
  44. return length;
  45. }
  46. const context = getContext(domElement);
  47. if (context) {
  48. return context.index;
  49. }
  50. if (length === 0) {
  51. return 0;
  52. }
  53. const firstDomListElement = getHtmlElementFromNode(defaultNodes[0]);
  54. const indexFirstDomListElement = [...domChildren].findIndex(
  55. element => element === firstDomListElement
  56. );
  57. return domIndex < indexFirstDomListElement ? 0 : length;
  58. }
  59. }
  60. export { ComponentStructure };