35 lines
859 B
Vue
35 lines
859 B
Vue
import { flattenChildren, isValidElement } from '../_util/props-util';
|
|
|
|
export function convertChildrenToData(nodes: any[]): any[] {
|
|
return flattenChildren(nodes)
|
|
.map(node => {
|
|
if (!isValidElement(node) || !node.type) {
|
|
return null;
|
|
}
|
|
const { default: d, ...restSlot } = node.children || {};
|
|
const children = d ? d() : [];
|
|
const {
|
|
key,
|
|
props: { value, ...restProps },
|
|
} = node;
|
|
|
|
const data = {
|
|
key,
|
|
value,
|
|
...restProps,
|
|
};
|
|
Object.keys(restSlot).forEach(p => {
|
|
if (typeof restSlot[p] === 'function') {
|
|
data[p] = restSlot[p]();
|
|
}
|
|
});
|
|
const childData = convertChildrenToData(children);
|
|
if (childData.length) {
|
|
data.children = childData;
|
|
}
|
|
|
|
return data;
|
|
})
|
|
.filter(data => data);
|
|
}
|