zmp-vue
Version:
Build full featured iOS & Android apps using ZMP & Vue
140 lines (115 loc) • 4.27 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _vue = require("vue");
var _utils = require("../shared/utils");
var _mixins = require("../shared/mixins");
var _zmp = require("../shared/zmp");
var _useTab = require("../shared/use-tab");
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
function render(_ctx, _cache) {
var _mergeProps2;
return (0, _vue.openBlock)(), (0, _vue.createBlock)("div", {
ref: "elRef",
class: _ctx.classes
}, [_ctx.tabContent ? ((0, _vue.openBlock)(), (0, _vue.createBlock)((0, _vue.resolveDynamicComponent)(_ctx.getComponent(_ctx.tabContent)), (0, _vue.mergeProps)((_mergeProps2 = {
key: 0
}, _mergeProps2["key"] = _ctx.tabContent.id, _mergeProps2), _ctx.getProps(_ctx.tabContent)), null, 16)) : (0, _vue.renderSlot)(_ctx.$slots, "default", {
key: 1
})], 2);
}
var _default = {
name: 'zmp-tab',
render: render,
props: _extends({
tabActive: Boolean
}, _mixins.colorProps),
emits: ['tab:show', 'tab:hide'],
setup: function setup(props, _ref) {
var emit = _ref.emit;
var elRef = (0, _vue.ref)(null);
var routerData = (0, _vue.ref)(null);
var route = (0, _vue.inject)('zmproute', null);
var router = (0, _vue.inject)('zmproute', null);
var initialTabContent = null;
if (!routerData.value && route && route.route && route.route.tab && route.route.tab.id === props.id) {
var _route$route$tab = route.route.tab,
component = _route$route$tab.component,
asyncComponent = _route$route$tab.asyncComponent;
if (component || asyncComponent) {
initialTabContent = {
id: (0, _utils.getComponentId)(),
component: component || asyncComponent,
isAsync: !!asyncComponent,
props: _extends({
zmprouter: router,
zmproute: route
}, route.params)
};
}
}
var tabContent = (0, _vue.ref)(initialTabContent || null);
var setTabContent = function setTabContent(newContent) {
tabContent.value = newContent;
};
if (_zmp.zmp && !routerData.value) {
routerData.value = {
setTabContent: setTabContent
};
_zmp.zmprouters.tabs.push(routerData.value);
}
(0, _vue.onMounted)(function () {
if (elRef.value && initialTabContent) {
elRef.value.zmpRouterTabLoaded = true;
}
(0, _zmp.zmpready)(function () {
if (!routerData.value) {
routerData.value = {
el: elRef.value,
setTabContent: setTabContent
};
_zmp.zmprouters.tabs.push(routerData.value);
} else {
routerData.value.el = elRef.value;
}
});
});
(0, _vue.onBeforeUnmount)(function () {
if (!routerData.value) return;
_zmp.zmprouters.tabs.splice(_zmp.zmprouters.tabs.indexOf(routerData.value), 1);
routerData.value = null;
});
(0, _vue.onUpdated)(function () {
if (!routerData.value || !_zmp.zmp) return;
_zmp.zmpevents.emit('tabRouterDidUpdate', routerData.value);
});
(0, _useTab.useTab)(elRef, emit);
var classes = (0, _vue.computed)(function () {
return (0, _utils.classNames)('tab', {
'tab-active': props.tabActive
}, (0, _mixins.colorClasses)(props));
});
var getComponent = function getComponent(content) {
return (0, _vue.toRaw)(content.component);
};
var getProps = function getProps(content) {
var tabComponent = content.component,
tabProps = content.props;
var keys = [];
var passProps = {};
if (tabComponent && tabComponent.props) keys = Object.keys(tabComponent.props);
keys.forEach(function (key) {
if (key in tabProps) passProps[key] = tabProps[key];
});
return passProps;
};
return {
elRef: elRef,
classes: classes,
tabContent: tabContent,
getComponent: getComponent,
getProps: getProps
};
}
};
exports.default = _default;