2025-06-26 14:55:08 +08:00

57 lines
1.3 KiB
JavaScript

/**
* Create a basic component with common options
*/
import '../../locale';
import { isFunction } from '..';
import { camelize } from '../format/string';
import { SlotsMixin } from '../../mixins/slots';
import Vue from 'vue';
function install(Vue) {
var name = this.name;
Vue.component(name, this);
Vue.component(camelize("-" + name), this);
} // unify slots & scopedSlots
export function unifySlots(context) {
// use data.scopedSlots in lower Vue version
var scopedSlots = context.scopedSlots || context.data.scopedSlots || {};
var slots = context.slots();
Object.keys(slots).forEach(function (key) {
if (!scopedSlots[key]) {
scopedSlots[key] = function () {
return slots[key];
};
}
});
return scopedSlots;
} // should be removed after Vue 3
function transformFunctionComponent(pure) {
return {
functional: true,
props: pure.props,
model: pure.model,
render: function render(h, context) {
return pure(h, context.props, unifySlots(context), context);
}
};
}
export function createComponent(name) {
return function (sfc) {
if (isFunction(sfc)) {
sfc = transformFunctionComponent(sfc);
}
if (!sfc.functional) {
sfc.mixins = sfc.mixins || [];
sfc.mixins.push(SlotsMixin);
}
sfc.name = name;
sfc.install = install;
return sfc;
};
}