UNPKG

@gyenno/nutui-taro

Version:

京东风格的轻量级移动端 Vue2、Vue3 组件库(支持小程序开发)

244 lines (243 loc) 6.77 kB
import { c as createComponent } from "./component-25dcca32.js"; import { reactive, computed, watch, watchEffect, toRefs, resolveComponent, openBlock, createElementBlock, createBlock, mergeProps, createCommentVNode, createTextVNode, createVNode, Transition, withCtx, withDirectives, createElementVNode, normalizeClass, normalizeStyle, renderSlot, vShow } from "vue"; import OverLay from "./Overlay.js"; import { Close } from "@nutui/icons-vue-taro"; import { _ as _export_sfc } from "./_plugin-vue_export-helper-cc2b3d55.js"; const popupProps = { visible: { type: Boolean, default: false }, zIndex: { type: [Number, String], default: 2e3 }, duration: { type: [Number, String], default: 0.3 }, lockScroll: { type: Boolean, default: true }, closeOnClickOverlay: { type: Boolean, default: true }, position: { type: String, default: "center" }, transition: { type: String, default: "" }, style: { type: Object, default: {} }, popClass: { type: String, default: "" }, closeable: { type: Boolean, default: false }, closeIconPosition: { type: String, default: "top-right" }, closeIcon: { type: String, default: "close" }, destroyOnClose: { type: Boolean, default: true }, teleport: { type: [String, Element], default: "body" }, overlay: { type: Boolean, default: true }, round: { type: Boolean, default: false }, teleportDisable: { type: Boolean, default: false }, safeAreaInsetBottom: { type: Boolean, default: false }, overlayClass: { type: String, default: "" }, overlayStyle: { type: Object, default: {} } }; const initIndex = 2e3; let _zIndex = initIndex; const component = (componentName2, components) => { return { components, props: { ...popupProps }, emits: ["click-pop", "click-close-icon", "open", "close", "opend", "closed", "click-overlay", "update:visible"], setup(props, { emit }) { const state = reactive({ zIndex: props.zIndex, showSlot: true, closed: props.closeable }); const classes = computed(() => { const prefixCls = componentName2; return { [prefixCls]: true, ["round"]: props.round, [`nut-popup--${props.position}`]: true, [`nut-popup--${props.position}--safebottom`]: props.position === "bottom" && props.safeAreaInsetBottom, [props.popClass]: true }; }); const popStyle = computed(() => { return { zIndex: state.zIndex, transitionDuration: `${props.duration}s`, ...props.style }; }); const transitionName = computed(() => { return props.transition ? props.transition : `nut-popup-slide-${props.position}`; }); const open = () => { if (props.zIndex !== initIndex) { _zIndex = Number(props.zIndex); } emit("update:visible", true); state.zIndex = ++_zIndex; if (props.destroyOnClose) { state.showSlot = true; } emit("open"); }; const close = () => { emit("update:visible", false); emit("close"); if (props.destroyOnClose) { setTimeout(() => { state.showSlot = false; }, +props.duration * 1e3); } }; const onClick = (e) => { emit("click-pop", e); }; const onClickCloseIcon = (e) => { e.stopPropagation(); emit("click-close-icon", e); emit("update:visible", false); }; const onClickOverlay = (e) => { emit("click-overlay", e); if (props.closeOnClickOverlay) { emit("update:visible", false); } }; const onOpened = (e) => { emit("opend", e); }; const onClosed = (e) => { emit("closed", e); }; watch( () => props.visible, (val) => { props.visible ? open() : close(); } ); watchEffect(() => { state.closed = props.closeable; }); return { ...toRefs(state), popStyle, transitionName, classes, onClick, onClickCloseIcon, onClickOverlay, onOpened, onClosed }; } }; }; const { componentName, create } = createComponent("popup"); const _sfc_main = create( component(componentName, { [OverLay.name]: OverLay, Close }) ); function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_nut_overlay = resolveComponent("nut-overlay"); const _component_Close = resolveComponent("Close"); return openBlock(), createElementBlock("div", null, [ _ctx.overlay ? (openBlock(), createBlock(_component_nut_overlay, mergeProps({ key: 0, visible: _ctx.visible, "close-on-click-overlay": _ctx.closeOnClickOverlay, "z-index": _ctx.zIndex, "lock-scroll": _ctx.lockScroll, duration: _ctx.duration, "overlay-class": _ctx.overlayClass, "overlay-style": _ctx.overlayStyle, onClick: _ctx.onClickOverlay }, _ctx.$attrs), null, 16, ["visible", "close-on-click-overlay", "z-index", "lock-scroll", "duration", "overlay-class", "overlay-style", "onClick"])) : createCommentVNode("", true), createTextVNode(), createVNode(Transition, { name: _ctx.transitionName, onAfterEnter: _ctx.onOpened, onAfterLeave: _ctx.onClosed }, { default: withCtx(() => [ withDirectives(createElementVNode("view", { class: normalizeClass(_ctx.classes), style: normalizeStyle(_ctx.popStyle), onClick: _cache[1] || (_cache[1] = (...args) => _ctx.onClick && _ctx.onClick(...args)) }, [ _ctx.showSlot ? renderSlot(_ctx.$slots, "default", { key: 0 }) : createCommentVNode("", true), createTextVNode(), _ctx.closed ? (openBlock(), createElementBlock("view", { key: 1, onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClickCloseIcon && _ctx.onClickCloseIcon(...args)), class: normalizeClass(["nut-popup__close-icon", "nut-popup__close-icon--" + _ctx.closeIconPosition]) }, [ renderSlot(_ctx.$slots, "close-icon", {}, () => [ createVNode(_component_Close, { height: "12px" }) ]) ], 2)) : createCommentVNode("", true) ], 6), [ [vShow, _ctx.visible] ]) ]), _: 3 }, 8, ["name", "onAfterEnter", "onAfterLeave"]) ]); } const Popup = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]); export { Popup as P, popupProps as p };