tdesign-vue
Version:
222 lines (218 loc) • 8.49 kB
JavaScript
/**
* tdesign v1.14.1
* (c) 2025 tdesign
* @license MIT
*/
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
import Vue from 'vue';
var _excluded = ["name"];
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var defaultModel = {
prop: "value",
event: "input"
};
function toCamel(str) {
return str.replace(/-([a-z])/gi, function (m, letter) {
return letter.toUpperCase();
});
}
function getPropOptionMap(props) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var propOptionMap = {};
var model = options.model;
function parseProp(propOption) {
var propName = propOption.name,
others = _objectWithoutProperties(propOption, _excluded);
var camelName = propName.replace(/^[a-z]/, function (letter) {
return letter.toUpperCase();
});
var defaultName = "default".concat(camelName);
var dataName = "data".concat(camelName);
var events = [];
if (propOption.event) {
events = events.concat(propOption.event);
} else if (model.prop === propName) {
events = events.concat(model.event);
} else {
events = events.concat("update:".concat(propName));
}
return _objectSpread({
events: events,
defaultName: defaultName,
dataName: dataName
}, others);
}
props.forEach(function (prop) {
var defaultOption = {
alias: []
};
var propOption;
if (typeof prop === "string") {
propOption = _objectSpread(_objectSpread({}, defaultOption), {}, {
name: prop
});
} else {
propOption = _objectSpread(_objectSpread({}, defaultOption), prop);
}
propOptionMap[propOption.name] = parseProp(propOption);
});
return propOptionMap;
}
function mapProps (props) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
function mapProps(componentConstructor) {
var component = componentConstructor.prototype ? componentConstructor.prototype.constructor.options : componentConstructor;
var model = options.model || defaultModel;
var propOptionMap = getPropOptionMap(props, {
model: model
});
var defineProps = _objectSpread({}, component.props);
var defineWatches = {};
var defineEvents = [];
var defineMethods = {};
var propsKeys = Object.keys(component.props);
var camelPropsKeys = propsKeys.map(function (key) {
return toCamel(key);
});
Object.keys(propOptionMap).forEach(function (propName) {
var _propOptionMap$propNa = propOptionMap[propName],
events = _propOptionMap$propNa.events,
alias = _propOptionMap$propNa.alias,
defaultName = _propOptionMap$propNa.defaultName,
dataName = _propOptionMap$propNa.dataName;
defineProps[propName] = component.props[propName];
defineProps[defaultName] = component.props[defaultName];
if (alias) {
alias.forEach(function (prop) {
defineProps[prop] = defineProps[propName];
});
}
defineEvents = defineEvents.concat(events);
defineWatches[defaultName] = {
handler: function handler(v) {
if (defaultName in this.$vnode.componentOptions.propsData && !(propName in this.$vnode.componentOptions.propsData)) {
this.$data[dataName] = v;
}
},
immediate: true
};
alias.forEach(function (aliasItem) {
defineWatches[aliasItem] = {
handler: function handler(v) {
if (aliasItem in this.$vnode.componentOptions.propsData && !(propName in this.$vnode.componentOptions.propsData)) {
this.$data[dataName] = v;
}
},
immediate: true
};
});
defineWatches[propName] = {
handler: function handler(v) {
if (propName in this.$vnode.componentOptions.propsData) {
this.$data[dataName] = v;
}
},
immediate: true
};
});
if (component.methods) {
Object.keys(component.methods).forEach(function (key) {
defineMethods[key] = function () {
if (this.$refs.component) {
var _this$$refs$component;
return (_this$$refs$component = this.$refs.component)[key].apply(_this$$refs$component, arguments);
}
};
});
}
var name = component.name;
return Vue.extend({
name: "".concat(name, "-mapprops"),
inheritAttrs: false,
model: {
prop: model.prop,
event: Array.isArray(model.event) ? model.event[0] : model.event
},
data: function data() {
var data = {};
Object.keys(propOptionMap).forEach(function (propName) {
var dataName = propOptionMap[propName].dataName;
data[dataName] = void 0;
});
return _objectSpread({}, data);
},
props: _objectSpread({}, defineProps),
computed: {
_listeners: function _listeners() {
var _this = this;
var others = {};
Object.keys(this.$listeners).forEach(function (event) {
if (defineEvents.indexOf(event) === -1) {
others[event] = function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this.$emit.apply(_this, [event].concat(args));
};
}
});
return others;
}
},
watch: defineWatches,
render: function render(h) {
var _this2 = this;
var propMap = {};
var handlerMap = {};
Object.keys(propOptionMap).forEach(function (propName) {
var _propOptionMap$propNa2 = propOptionMap[propName],
dataName = _propOptionMap$propNa2.dataName,
events = _propOptionMap$propNa2.events;
if (propName in _this2.$vnode.componentOptions.propsData || typeof _this2[dataName] !== "undefined") {
propMap[propName] = _this2[dataName];
}
handlerMap[events[0]] = function (v) {
for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
args[_key2 - 1] = arguments[_key2];
}
return _this2.updateData.apply(_this2, [propName, v].concat(args));
};
});
var attrs = {};
Object.keys(this.$attrs).forEach(function (attrName) {
var camelAttrKey = toCamel(attrName);
if (camelPropsKeys.indexOf(camelAttrKey) === -1) {
attrs[attrName] = _this2.$attrs[attrName];
}
});
return h(component, {
props: _objectSpread(_objectSpread({}, this.$props), propMap),
attrs: _objectSpread({}, attrs),
on: _objectSpread(_objectSpread({}, this._listeners), handlerMap),
scopedSlots: _objectSpread({}, this.$scopedSlots),
ref: "component"
});
},
methods: _objectSpread({
updateData: function updateData(propName, v) {
var _this3 = this;
for (var _len3 = arguments.length, args = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
args[_key3 - 2] = arguments[_key3];
}
propOptionMap[propName].events.forEach(function (event) {
_this3.$emit.apply(_this3, [event, v].concat(args));
});
if (!(propName in this.$vnode.componentOptions.propsData)) {
this[propOptionMap[propName].dataName] = v;
return true;
}
}
}, defineMethods)
});
}
return mapProps;
}
export { mapProps as default };
//# sourceMappingURL=map-props.js.map