UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 5.76 kB
{"version":3,"file":"drop-down.mjs","sources":["../../../../../src/components/ivue-select/drop-down.vue"],"sourcesContent":["<template>\r\n <div\r\n class=\"ivue-select-dropdown\"\r\n :class=\"className\"\r\n :style=\"{\r\n minWidth,\r\n ...styles,\r\n }\"\r\n >\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n defineComponent,\r\n computed,\r\n reactive,\r\n onMounted,\r\n inject,\r\n nextTick,\r\n getCurrentInstance,\r\n onBeforeUnmount,\r\n} from 'vue';\r\nimport { getStyle } from '../../utils/assist';\r\nimport { transferIndex, transferIncrease } from '../../utils/transfer-queue';\r\n\r\n// createPopper\r\nimport { createPopper } from '@popperjs/core';\r\n\r\n// type\r\nimport type { Props, Data } from './types/drop-down';\r\nimport { SelectContextKey } from './types/select';\r\n\r\nconst prefixCls = 'ivue-select-dropdown';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n props: {\r\n /**\r\n * 外层样式\r\n *\r\n * @type {String}\r\n */\r\n className: {\r\n type: String,\r\n },\r\n /**\r\n * 是否将弹层放置于 body 内,在 Tabs、\r\n * 带有 fixed 的 Table 列内使用时,\r\n * 建议添加此属性,它将不受父级样式影响,\r\n * 从而达到更好的效果\r\n *\r\n * @type {Boolean}\r\n */\r\n transfer: {\r\n type: Boolean,\r\n default() {\r\n const global = getCurrentInstance().appContext.config.globalProperties;\r\n\r\n return !global.$IVUE || global.$IVUE.transfer === ''\r\n ? false\r\n : global.$IVUE.transfer;\r\n },\r\n },\r\n /**\r\n * 弹窗的展开方向,\r\n * 可选值为 top、bottom、top-start、bottom-start、top-end、bottom-end\r\n *\r\n * @type {String}\r\n */\r\n placement: {\r\n type: String,\r\n default: 'bottom-start',\r\n },\r\n },\r\n setup(props: Props) {\r\n // inject\r\n const select = inject(SelectContextKey);\r\n\r\n // vm\r\n const { proxy } = getCurrentInstance();\r\n\r\n // 获取Index\r\n const handleGetIndex = () => {\r\n transferIncrease();\r\n return transferIndex;\r\n };\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 是否显示菜单\r\n *\r\n * @type {String}\r\n */\r\n width: '',\r\n /**\r\n * index\r\n *\r\n * @type {Number}\r\n */\r\n tIndex: handleGetIndex(),\r\n /**\r\n * popper\r\n *\r\n * @type {Function}\r\n */\r\n popper: null,\r\n /**\r\n * popper状态\r\n *\r\n * @type {Boolean}\r\n */\r\n popperStatus: false,\r\n });\r\n\r\n // computed\r\n const styles = computed(() => {\r\n const style: {\r\n zIndex?: number;\r\n } = {};\r\n\r\n if (props.transfer) {\r\n style['z-index'] = 1060 + data.tIndex;\r\n }\r\n\r\n return style;\r\n });\r\n\r\n const minWidth = computed(() => {\r\n return select && `${getStyle(select.selectWrapper, 'width')}`;\r\n });\r\n\r\n // methods\r\n\r\n // 更新数据\r\n const update = () => {\r\n nextTick(() => {\r\n // 是否已经注册了 popper\r\n if (data.popper) {\r\n data.popper.update();\r\n data.popperStatus = true;\r\n } else {\r\n data.popper = createPopper(select.reference, proxy.$el, {\r\n // 弹窗的展开方向,\r\n placement: props.placement,\r\n modifiers: [\r\n // 这决定了是否使用 GPU 加速样式来定位 popper\r\n {\r\n name: 'computeStyles',\r\n options: {\r\n gpuAcceleration: false, // true by default\r\n },\r\n },\r\n //检测溢出\r\n {\r\n name: 'preventOverflow',\r\n options: {\r\n rootBoundary: 'viewport',\r\n },\r\n },\r\n {\r\n name: 'offset',\r\n options: {\r\n offset: [0, 5],\r\n },\r\n },\r\n ],\r\n onFirstUpdate: () => {\r\n nextTick(() => {\r\n data.popper && data.popper.update();\r\n });\r\n },\r\n });\r\n }\r\n\r\n data.tIndex = handleGetIndex();\r\n });\r\n };\r\n\r\n // 销毁\r\n const destroy = () => {\r\n if (data.popper) {\r\n setTimeout(() => {\r\n if (data.popper && !data.popperStatus) {\r\n data.popper.destroy();\r\n data.popper = null;\r\n }\r\n\r\n data.popperStatus = false;\r\n }, 300);\r\n }\r\n };\r\n\r\n // onMounted\r\n onMounted(() => {\r\n update();\r\n });\r\n\r\n // beforeUnmount\r\n onBeforeUnmount(() => {\r\n if (data.popper) {\r\n data.popper.destroy();\r\n data.popper = null;\r\n }\r\n });\r\n\r\n return {\r\n // data\r\n data,\r\n\r\n // computed\r\n styles,\r\n minWidth,\r\n\r\n // methods\r\n update,\r\n destroy,\r\n };\r\n },\r\n});\r\n</script>\r\n"],"names":["_openBlock","_createElementBlock","_normalizeClass","_normalizeStyle"],"mappings":";;;;SAES,YAAC,IAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAsB,OACpB,QAAS,EAAA;AACX,EAAA,OAAAA,SAAA,EAAA,EAAAC,kBAAA,CAAA,KAAA,EAAA;AAAA,IAAA,OAAAC,cAAW,CAAA,CAAQ,sBAAA,EAAA,IAAA,CAAA,SAAA,CAAA,CAAA;AAAA,IAAA,OAAYC,cAAM,CAAA;AAAA,MAAA,UAAA,IAAA,CAAA,QAAA;AAAA;KAK3C,CAAA;AAAA,GAAA,EAAA;AAAA;;;;;;;"}