jiaojiu/node_modules/vant/lib/utils/create/component.js

70 lines
1.6 KiB

"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.unifySlots = unifySlots;
exports.createComponent = createComponent;
require("../../locale");
var _ = require("..");
var _string = require("../format/string");
var _slots = require("../../mixins/slots");
var _vue = _interopRequireDefault(require("vue"));
/**
* Create a basic component with common options
*/
function install(Vue) {
var name = this.name;
Vue.component(name, this);
Vue.component((0, _string.camelize)("-" + name), this);
} // unify slots & scopedSlots
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);
}
};
}
function createComponent(name) {
return function (sfc) {
if ((0, _.isFunction)(sfc)) {
sfc = transformFunctionComponent(sfc);
}
if (!sfc.functional) {
sfc.mixins = sfc.mixins || [];
sfc.mixins.push(_slots.SlotsMixin);
}
sfc.name = name;
sfc.install = install;
return sfc;
};
}