57 lines
1.3 KiB
JavaScript
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;
|
||
|
};
|
||
|
}
|