You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
2.1 KiB
78 lines
2.1 KiB
//const getHtmlElementFromNode = ({ el }) => el;
|
|
const getHtmlElementFromNode = node => {
|
|
const el =
|
|
node.el || (Array.isArray(node.children) && node.children[0].el.parentNode);
|
|
if (!el) {
|
|
console.error("使用 transition-group , 需要在slot中template内至少2层html标签");
|
|
}
|
|
return el || {};
|
|
};
|
|
|
|
const addContext = (domElement, context) =>
|
|
(domElement.__draggable_context = context);
|
|
const getContext = domElement => domElement.__draggable_context;
|
|
|
|
class ComponentStructure {
|
|
constructor({
|
|
nodes: { header, default: defaultNodes, footer },
|
|
root,
|
|
realList
|
|
}) {
|
|
this.defaultNodes = defaultNodes;
|
|
this.children = [...header, ...defaultNodes, ...footer];
|
|
this.externalComponent = root.externalComponent;
|
|
this.rootTransition = root.transition;
|
|
this.tag = root.tag;
|
|
this.realList = realList;
|
|
}
|
|
|
|
get _isRootComponent() {
|
|
return this.externalComponent || this.rootTransition;
|
|
}
|
|
|
|
render(h, attributes) {
|
|
const { tag, children, _isRootComponent } = this;
|
|
const option = !_isRootComponent ? children : { default: () => children };
|
|
return h(tag, attributes, option);
|
|
}
|
|
|
|
updated() {
|
|
const { defaultNodes, realList } = this;
|
|
defaultNodes.forEach((node, index) => {
|
|
addContext(getHtmlElementFromNode(node), {
|
|
element: realList[index],
|
|
index
|
|
});
|
|
});
|
|
}
|
|
|
|
getUnderlyingVm(domElement) {
|
|
return getContext(domElement);
|
|
}
|
|
|
|
getVmIndexFromDomIndex(domIndex, element) {
|
|
const { defaultNodes } = this;
|
|
const { length } = defaultNodes;
|
|
const domChildren = element.children;
|
|
const domElement = domChildren.item(domIndex);
|
|
|
|
if (domElement === null) {
|
|
return length;
|
|
}
|
|
const context = getContext(domElement);
|
|
if (context) {
|
|
return context.index;
|
|
}
|
|
|
|
if (length === 0) {
|
|
return 0;
|
|
}
|
|
const firstDomListElement = getHtmlElementFromNode(defaultNodes[0]);
|
|
const indexFirstDomListElement = [...domChildren].findIndex(
|
|
element => element === firstDomListElement
|
|
);
|
|
return domIndex < indexFirstDomListElement ? 0 : length;
|
|
}
|
|
}
|
|
|
|
export { ComponentStructure };
|
|
|