123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- /**
- * 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;
- };
- }
|