UNPKG

@opensig/opendesign

Version:

<p align="center"><img src="../docs/public/opendesign-logo-light.png"/></p> <h1 align="center">opendesign</h1> <p align="center">一个 Vue 3 组件库</p> <p align="center"><b>皮肤可定制,使用 TypeScript</b></p>

156 lines (155 loc) 5.43 kB
import { defineComponent, ref, inject, getCurrentInstance, computed, watch, onMounted, nextTick, createElementBlock, openBlock, Fragment, createVNode, unref, withCtx, createBlock, createCommentVNode, Teleport, createElementVNode, normalizeClass, renderSlot, createTextVNode, toDisplayString, Transition, withDirectives, mergeProps, vShow } from "vue"; import { tabInjectKey } from "./provide.mjs"; import { tabPaneProps } from "./types.mjs"; import { IconClose } from "../_utils/icons.mjs"; import ClientOnly from "../_components/client-only.mjs"; import { isUndefined } from "../_utils/is.mjs"; import { log } from "../_utils/log.mjs"; const __default__ = { inheritAttrs: false }; const _sfc_main = /* @__PURE__ */ defineComponent({ ...__default__, __name: "OTabPane", props: tabPaneProps, setup(__props) { const props = __props; const isClosed = ref(false); const navRef = ref(null); const tabInjection = inject(tabInjectKey, null); const { navsRef, activeValue, lazy } = tabInjection || {}; const instance = getCurrentInstance(); if (isUndefined(props.value) && isUndefined(props.label)) { log.warn("OTabPane is missing prop: value or lable"); } const paneKey = computed(() => { return props.value ?? props.label ?? (instance == null ? void 0 : instance.uid) ?? Math.random(); }); const isActive = computed(() => paneKey.value === (activeValue == null ? void 0 : activeValue.value)); const hasActived = ref(isActive.value); const toMount = computed(() => { if (isActive.value) { return true; } if ((props.lazy || lazy) && !hasActived.value) { return false; } if (props.unmountOnHide) { return false; } return true; }); watch( () => isActive.value, (v) => { if (v) { hasActived.value = true; tabInjection == null ? void 0 : tabInjection.updateValue(paneKey.value, navRef.value); } } ); const navClick = () => { if (!props.disabled) { tabInjection == null ? void 0 : tabInjection.updateValue(paneKey.value, navRef.value); } }; const navCloseClick = (e) => { e.stopImmediatePropagation(); isClosed.value = true; tabInjection == null ? void 0 : tabInjection.onDeletePane(paneKey.value, e); }; onMounted(() => { nextTick(() => { tabInjection == null ? void 0 : tabInjection.initValue(paneKey.value, navRef.value); }); }); return (_ctx, _cache) => { return openBlock(), createElementBlock( Fragment, null, [ createVNode(unref(ClientOnly), null, { default: withCtx(() => [ unref(navsRef) && !isClosed.value ? (openBlock(), createBlock(Teleport, { key: 0, to: unref(navsRef), disabled: !unref(navsRef) }, [ createElementVNode( "div", { ref_key: "navRef", ref: navRef, class: normalizeClass([ "o-tab-nav", { "o-tab-nav-active": isActive.value, "o-tab-nav-disabled": props.disabled, "o-tab-nav-closable": props.closable } ]), onClick: navClick }, [ renderSlot(_ctx.$slots, "nav", {}, () => [ createTextVNode( toDisplayString(props.label || props.value), 1 /* TEXT */ ) ]), props.closable ? (openBlock(), createElementBlock("div", { key: 0, class: "o-tab-nav-close", onClick: navCloseClick }, [ createVNode(unref(IconClose)) ])) : createCommentVNode("v-if", true) ], 2 /* CLASS */ ) ], 8, ["to", "disabled"])) : createCommentVNode("v-if", true) ]), _: 3 /* FORWARDED */ }), createVNode(Transition, { name: props.transition }, { default: withCtx(() => [ !isClosed.value && toMount.value ? withDirectives((openBlock(), createElementBlock( "div", mergeProps({ key: 0, class: [ "o-tab-pane", { "o-tab-pane-active": isActive.value, "o-tab-pane-disabled": props.disabled, "o-tab-pane-closable": props.closable } ] }, _ctx.$attrs), [ renderSlot(_ctx.$slots, "default") ], 16 /* FULL_PROPS */ )), [ [vShow, isActive.value] ]) : createCommentVNode("v-if", true) ]), _: 3 /* FORWARDED */ }, 8, ["name"]) ], 64 /* STABLE_FRAGMENT */ ); }; } }); export { _sfc_main as default };