UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

1 lines 6.58 kB
{"version":3,"file":"collapse.mjs","sources":["../../../../../src/components/ivue-collapse/collapse.vue"],"sourcesContent":["<template>\r\n <div :class=\"classes\">\r\n <slot></slot>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n defineComponent,\r\n reactive,\r\n computed,\r\n provide,\r\n onMounted,\r\n watch,\r\n} from 'vue';\r\n\r\n// type\r\nimport { Props, Data, CascaderContextKey } from './types/collapse';\r\nimport type { PanelInstance } from './types/panel';\r\n\r\nconst prefixCls = 'ivue-collapse';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n emits: ['update:modelValue', 'on-change'],\r\n props: {\r\n /**\r\n * 当前激活的面板的 name\r\n *\r\n * @type {Array, String}\r\n */\r\n modelValue: {\r\n type: [Array, String],\r\n },\r\n /**\r\n * 是否开启简洁模式\r\n *\r\n * @type {Boolean}\r\n */\r\n simple: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 是否开启手风琴效果\r\n *\r\n * @type {Boolean}\r\n */\r\n accordion: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n },\r\n setup(props: Props, { emit }) {\r\n // 插入扩展\r\n const pushExpandable = (expandableListItem: PanelInstance) => {\r\n const expandableListItems = data.childrenList.expandable;\r\n\r\n // 寻找是否已经有了选项\r\n const findItem = expandableListItems.find((target: PanelInstance) => {\r\n return target.uid === expandableListItem?.uid;\r\n });\r\n\r\n if (!findItem) {\r\n data.childrenList.expandable = expandableListItems.concat([\r\n expandableListItem,\r\n ]);\r\n }\r\n };\r\n\r\n // 删除扩展\r\n const removeExpandable = (expandableListItem: PanelInstance) => {\r\n const expandableListItems = data.childrenList.expandable;\r\n\r\n // 寻找是否已经有了选项\r\n const findItem = expandableListItems.find((target: PanelInstance) => {\r\n return target.uid === expandableListItem.uid;\r\n });\r\n\r\n if (findItem) {\r\n data.childrenList.expandable = expandableListItems.filter(\r\n (target: PanelInstance) => target.uid !== expandableListItem.uid\r\n );\r\n }\r\n };\r\n\r\n // 子项点击切换\r\n const toggle = (obj: { name: string; isActive: boolean }) => {\r\n const name = obj.name.toString();\r\n\r\n let newActiveKey = [];\r\n\r\n // 是否开启手风琴效果\r\n const accordion = props.accordion;\r\n\r\n // 手风琴效果\r\n if (accordion) {\r\n if (!obj.isActive) {\r\n newActiveKey.push(name);\r\n }\r\n }\r\n // 普通效果\r\n else {\r\n // 获取当前需要激活的面板\r\n const activeKey = getActiveKey();\r\n\r\n // 面板的 index\r\n const nameIndex = activeKey.indexOf(name);\r\n\r\n // 是否已经激活\r\n if (obj.isActive) {\r\n if (nameIndex > -1) {\r\n activeKey.splice(nameIndex, 1);\r\n }\r\n } else {\r\n if (nameIndex < 0) {\r\n activeKey.push(name);\r\n }\r\n }\r\n\r\n newActiveKey = activeKey;\r\n }\r\n\r\n // 重新设置当前激活的面板\r\n data.currentValue = newActiveKey;\r\n\r\n // 设置激活\r\n setActive();\r\n\r\n // 设置 v-model\r\n emit('update:modelValue', newActiveKey);\r\n\r\n // 切换面板是触发,返回当前展开的面板的 key,格式为数组\r\n emit('on-change', newActiveKey);\r\n };\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 当前值\r\n *\r\n * @type {Array, String}\r\n */\r\n currentValue: props.modelValue,\r\n /**\r\n * 子级\r\n *\r\n * @type {Array}\r\n */\r\n childrenList: {\r\n /**\r\n * 扩展列表\r\n *\r\n * @type {Array}\r\n */\r\n expandable: [],\r\n // 插入扩展\r\n pushExpandable: pushExpandable,\r\n // 删除扩展\r\n removeExpandable: removeExpandable,\r\n // 切换\r\n toggle: toggle,\r\n },\r\n });\r\n\r\n // computed\r\n\r\n // 外层样式\r\n const classes = computed(() => {\r\n return [\r\n `${prefixCls}`,\r\n {\r\n [`${prefixCls}-simple`]: props.simple,\r\n },\r\n ];\r\n });\r\n\r\n // methods\r\n\r\n // 设置激活的面板\r\n const setActive = () => {\r\n const activeKey = getActiveKey();\r\n\r\n const childrenList = data.childrenList.expandable;\r\n\r\n childrenList.forEach((vm: PanelInstance, index: number) => {\r\n const { proxy } = vm;\r\n\r\n // 子项名称\r\n const name = proxy.name || index.toString();\r\n\r\n proxy.data.isActive = activeKey.indexOf(name) > -1;\r\n proxy.data.index = index;\r\n });\r\n };\r\n\r\n // 获取激活的key\r\n const getActiveKey = () => {\r\n // 获取初始化需要激活的面板\r\n let activeKey = data.currentValue || [];\r\n\r\n // 是否开启手风琴效果\r\n const accordion = props.accordion;\r\n\r\n // 判断是否是数组\r\n if (!Array.isArray(activeKey)) {\r\n activeKey = [activeKey];\r\n }\r\n\r\n // 手风琴效果\r\n if (accordion && activeKey.length > 1) {\r\n activeKey = [activeKey[0]];\r\n }\r\n\r\n for (let i = 0; i < activeKey.length; i++) {\r\n // 把value字符串化\r\n activeKey[i] = activeKey[i].toString();\r\n }\r\n\r\n return activeKey;\r\n };\r\n\r\n // watch\r\n\r\n // 监听 v-modal\r\n watch(\r\n () => props.modelValue,\r\n (value) => {\r\n data.currentValue = value;\r\n }\r\n );\r\n\r\n // 监听当前值\r\n watch(\r\n () => data.currentValue,\r\n () => {\r\n setActive();\r\n }\r\n );\r\n\r\n // provide\r\n provide(CascaderContextKey, data.childrenList);\r\n\r\n // onMounted\r\n onMounted(() => {\r\n setActive();\r\n });\r\n\r\n return {\r\n data,\r\n\r\n // computed\r\n classes,\r\n };\r\n },\r\n});\r\n</script>\r\n"],"names":["_normalizeClass"],"mappings":";;;;AACa,SAAA,YAAA,IAAE,EAAA,MAAA,EAAO,MAAA,EAAA,MAAA,EAAA,OAAA,QAAA,EAAA;;IAClB,KAAA,EAAaA,cAAA,CAAA,IAAA,CAAA,OAAA,CAAA;AAAA,GAAA,EAAA;AAAA;;;;;;;"}