ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 27.7 kB
Source Map (JSON)
{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-cascader/index.vue"],"sourcesContent":["<template>\r\n <div :class=\"classes\" v-outside=\"handleClickOutside\">\r\n <!-- 输入框 -->\r\n <div :class=\"inputClasses\" ref=\"reference\" @click=\"handleToggleOpen\">\r\n <input type=\"hidden\" :name=\"name\" :value=\"data.currentValue\" />\r\n\r\n <slot>\r\n <ivue-input\r\n :id=\"id\"\r\n :isValue=\"true\"\r\n :readonly=\"!filterable\"\r\n :disabled=\"disabled\"\r\n :modelValue=\"displayInputRender\"\r\n :placeholder=\"inputPlaceholder\"\r\n @on-change=\"handleChangeInput\"\r\n ref=\"input\"\r\n >\r\n <!-- 下拉图标 -->\r\n <template #suffix>\r\n <slot name=\"suffix\">\r\n <!-- 清除按钮 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-clearable ${clearableIconClass}`\"\r\n v-show=\"showCloseIcon\"\r\n @click.stop=\"handleClearSelect\"\r\n >{{ clearableIcon }}</ivue-icon\r\n >\r\n <!-- 下拉按钮 -->\r\n <ivue-icon\r\n :class=\"`${prefixCls}-arrow ${arrowDownIconClass}`\"\r\n @click.stop=\"handleToggleOpen\"\r\n >{{ arrowDownIcon }}</ivue-icon\r\n >\r\n </slot>\r\n </template>\r\n </ivue-input>\r\n <!-- 是否支持搜索 -->\r\n <div\r\n :class=\"`${prefixCls}-label`\"\r\n v-show=\"filterable && data.queryData === ''\"\r\n @click=\"handleInputFocus\"\r\n >\r\n {{ displayRender }}\r\n </div>\r\n </slot>\r\n </div>\r\n <!-- 下拉菜单 -->\r\n <transition name=\"transition-drop\">\r\n <drop-down\r\n :transfer=\"transfer\"\r\n :data-transfer=\"transfer\"\r\n :class=\"dropdownClasses\"\r\n :style=\"dropdownStyles\"\r\n v-transfer-dom\r\n ref=\"dropdown\"\r\n v-show=\"data.visibleMenu\"\r\n >\r\n <div>\r\n <!-- 菜单 -->\r\n <ivue-cascader-menu\r\n :options=\"options\"\r\n :disabled=\"disabled\"\r\n :changeOnSelect=\"changeOnSelect\"\r\n :trigger=\"trigger\"\r\n ref=\"menu\"\r\n v-show=\"!filterable || (filterable && data.queryData === '')\"\r\n ></ivue-cascader-menu>\r\n <!-- 有数据 -->\r\n <div\r\n :class=\"`${prefixCls}-dropdown`\"\r\n v-show=\"\r\n filterable && data.queryData !== '' && querySelections.length\r\n \"\r\n >\r\n <ul :class=\"`${prefixCls}-dropdown--list`\">\r\n <li\r\n :class=\"[\r\n `${prefixCls}-dropdown--item`,\r\n {\r\n [`${prefixCls}-dropdown--item__disabled`]: item.disabled,\r\n },\r\n ]\"\r\n v-for=\"(item, index) in querySelections\"\r\n :key=\"index\"\r\n v-html=\"item.display\"\r\n @click=\"handleSelectItem(item)\"\r\n ></li>\r\n </ul>\r\n </div>\r\n <!-- 当搜索列表为空时显示的内容 -->\r\n <ul\r\n :class=\"`${prefixCls}-not-found-tip`\"\r\n v-show=\"\r\n (filterable &&\r\n data.queryData !== '' &&\r\n !querySelections.length) ||\r\n !options.length\r\n \"\r\n >\r\n <li :class=\"`${prefixCls}-not-found-tip-text`\">\r\n {{ notFoundText }}\r\n </li>\r\n </ul>\r\n </div>\r\n </drop-down>\r\n </transition>\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 ref,\r\n provide,\r\n watch,\r\n nextTick,\r\n onMounted,\r\n getCurrentInstance,\r\n} from 'vue';\r\n\r\nimport { oneOf } from '../../utils/assist';\r\nimport { Outside, TransferDom } from '../../utils/directives';\r\n\r\nimport IvueInput from '../ivue-input/index.vue';\r\nimport IvueIcon from '../ivue-icon/index.vue';\r\nimport DropDown from '../ivue-select/drop-down.vue';\r\nimport IvueCascaderMenu from './menu.vue';\r\n\r\n// type\r\nimport {\r\n IvueInputInstance,\r\n CascaderContextKey,\r\n DropDownInstance,\r\n IvueCascaderMenuInstance,\r\n Props,\r\n Data,\r\n Options,\r\n ResultChange,\r\n Result,\r\n} from './types/cascader';\r\nimport { SelectContextKey } from '../ivue-select/types/select';\r\n\r\nconst prefixCls = 'ivue-cascader';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n // 注册局部指令\r\n directives: { Outside, TransferDom },\r\n emits: ['on-change', 'update:modelValue', 'on-visible-change'],\r\n props: {\r\n /**\r\n * 可选项的数据源\r\n *\r\n * @type {Array}\r\n */\r\n options: {\r\n type: Array,\r\n default: () => [],\r\n },\r\n /**\r\n * 当前已选项的数据\r\n *\r\n * @type {Array}\r\n */\r\n modelValue: {\r\n type: Array,\r\n },\r\n /**\r\n * input name\r\n *\r\n * @type {String}\r\n */\r\n name: {\r\n type: String,\r\n },\r\n /**\r\n * id\r\n *\r\n * @type {String}\r\n */\r\n id: {\r\n type: String,\r\n },\r\n /**\r\n * 是否支持搜索\r\n *\r\n * @type {Boolean}\r\n */\r\n filterable: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 是否禁用选择组件\r\n *\r\n * @type {Boolean}\r\n */\r\n disabled: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 选择后展示的函数,用于自定义显示格式\r\n *\r\n * @type {Function}\r\n */\r\n renderFormat: {\r\n type: Function,\r\n default: (label: string[] | number[]) => {\r\n return label.join(' / ');\r\n },\r\n },\r\n /**\r\n * 输入框占位符\r\n *\r\n * @type {String}\r\n */\r\n placeholder: {\r\n type: String,\r\n default: '请选择',\r\n },\r\n /**\r\n * 下拉图标\r\n *\r\n * @type {Boolean}\r\n */\r\n arrowDownIcon: {\r\n type: String,\r\n default: 'keyboard_arrow_down',\r\n },\r\n /**\r\n * 下拉图标Class\r\n *\r\n * @type {Boolean}\r\n */\r\n arrowDownIconClass: {\r\n type: String,\r\n default: '',\r\n },\r\n /**\r\n * 清除按钮图标\r\n *\r\n * @type {Boolean}\r\n */\r\n clearableIcon: {\r\n type: String,\r\n default: 'cancel',\r\n },\r\n /**\r\n * 清除按钮图标Class\r\n *\r\n * @type {Boolean}\r\n */\r\n clearableIconClass: {\r\n type: String,\r\n default: '',\r\n },\r\n /**\r\n * 开启 transfer 时,给浮层添加额外的 class 名称\r\n *\r\n * @type {String}\r\n */\r\n transferClassName: {\r\n type: String,\r\n },\r\n /**\r\n * 是否将弹层放置于 body 内、\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 * 当此项为 true 时,点选每级菜单选项值都会发生变化\r\n *\r\n * @type {Boolean}\r\n */\r\n changeOnSelect: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 菜单展开方式,可选值为 click 或 hover\r\n *\r\n * @type {String}\r\n */\r\n trigger: {\r\n validator(value: string) {\r\n return oneOf(value, ['click', 'hover']);\r\n },\r\n default: 'click',\r\n },\r\n /**\r\n * 动态获取数据,数据源需标识 loading\r\n *\r\n * @type {Function}\r\n */\r\n loadData: {\r\n type: Function,\r\n default: () => {},\r\n },\r\n /**\r\n * 清除按钮\r\n *\r\n * @type {Boolean}\r\n */\r\n clearable: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 当搜索列表为空时显示的内容\r\n *\r\n * @type {String}\r\n */\r\n notFoundText: {\r\n type: String,\r\n default: '无匹配数据',\r\n },\r\n },\r\n setup(props: Props, { emit }) {\r\n // dom\r\n const input = ref<IvueInputInstance>();\r\n const reference = ref<HTMLDivElement>();\r\n const dropdown = ref<DropDownInstance>();\r\n const menu = ref<IvueCascaderMenuInstance>();\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 是否显示菜单\r\n *\r\n * @type {Boolean}\r\n */\r\n visibleMenu: false,\r\n /**\r\n * 当前的value\r\n *\r\n * @type {Array}\r\n */\r\n currentValue: props.modelValue || [],\r\n /**\r\n * 选择的数据\r\n *\r\n * @type {Array}\r\n */\r\n selected: [],\r\n /**\r\n * 请求的输入\r\n *\r\n * @type {String}\r\n */\r\n queryData: '',\r\n /**\r\n * 有效数据流\r\n *\r\n * @type {String}\r\n */\r\n validDataStr: '',\r\n /**\r\n * 加载子项\r\n *\r\n * @type {Boolean}\r\n */\r\n isLoadedChildren: false,\r\n /**\r\n * 临时选择\r\n *\r\n * @type {Array}\r\n */\r\n tmpSelected: [],\r\n /**\r\n * 修复 changeOnSelect 类型中的设置值\r\n *\r\n * @type {Boolean}\r\n */\r\n updatingValue: false,\r\n /**\r\n * 解决 value 置为 null 时,$emit:update:modelValue [] 而不是 null\r\n *\r\n * @type {Boolean}\r\n */\r\n isValueNull: false,\r\n /**\r\n * 过滤选择\r\n *\r\n * @type {Boolean}\r\n */\r\n filterableSelect: true,\r\n });\r\n\r\n // onMounted\r\n onMounted(() => {\r\n // 有效数据流\r\n data.validDataStr = JSON.stringify(getValidData(props.options));\r\n\r\n // 更新选项\r\n updateSelected(true);\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}-visible`]: data.visibleMenu,\r\n [`${prefixCls}-disabled`]: props.disabled,\r\n [`${prefixCls}-not-found`]:\r\n props.filterable &&\r\n data.queryData !== '' &&\r\n !querySelections.value.length,\r\n },\r\n ];\r\n });\r\n\r\n // input样式\r\n const inputClasses = computed(() => {\r\n return [\r\n `${prefixCls}-input`,\r\n {\r\n [`${prefixCls}-show-clear`]: showCloseIcon.value,\r\n },\r\n ];\r\n });\r\n\r\n // 显示渲染\r\n const displayRender = computed(() => {\r\n const label = [];\r\n for (let i = 0; i < data.selected.length; i++) {\r\n label.push(data.selected[i].label);\r\n }\r\n\r\n return props.renderFormat(label, data.selected);\r\n });\r\n\r\n // 获取的值\r\n const displayInputRender = computed(() => {\r\n return props.filterable ? '' : displayRender.value;\r\n });\r\n\r\n // 输入框提示\r\n const inputPlaceholder = computed(() => {\r\n return props.filterable && data.currentValue.length\r\n ? null\r\n : props.placeholder;\r\n });\r\n\r\n // 下拉框样式\r\n const dropdownClasses = computed(() => {\r\n return {\r\n [`${prefixCls}-dropdown-not-found`]:\r\n props.filterable &&\r\n data.queryData !== '' &&\r\n !querySelections.value.length,\r\n [`${prefixCls}-dropdown--transfer`]: props.transfer,\r\n [props.transferClassName]: props.transferClassName,\r\n };\r\n });\r\n\r\n // 下拉框样式\r\n const dropdownStyles = computed(() => {\r\n return {\r\n display: data.filterableSelect ? 'inline-block' : 'none',\r\n };\r\n });\r\n\r\n // 显示清除按钮\r\n const showCloseIcon = computed(() => {\r\n return (\r\n data.currentValue &&\r\n data.currentValue.length &&\r\n props.clearable &&\r\n !props.disabled\r\n );\r\n });\r\n\r\n // 获取查询的数据\r\n const querySelections = computed(() => {\r\n // 是否支持搜索\r\n if (!props.filterable) {\r\n return;\r\n }\r\n\r\n let selections = [];\r\n\r\n function getSelections(arr: Options[], label: string, value: string) {\r\n arr.forEach((item) => {\r\n // label\r\n item.__label = label ? `${label} / ${item.label}` : item.label;\r\n\r\n // value\r\n item.__value = value ? `${value},${item.value}` : item.value;\r\n\r\n if (item.children && item.children.length) {\r\n getSelections(item.children, item.__label, item.__value);\r\n\r\n delete item.__label;\r\n delete item.__value;\r\n } else {\r\n selections.push({\r\n label: item.__label,\r\n value: item.__value,\r\n display: item.__label,\r\n item: item,\r\n disabled: !!item.disabled,\r\n });\r\n }\r\n });\r\n }\r\n\r\n // 获取选项\r\n getSelections(props.options, null, null);\r\n\r\n // 当前匹配项\r\n selections = selections\r\n .filter((item) => {\r\n return item.label ? item.label.indexOf(data.queryData) > -1 : false;\r\n })\r\n .map((item) => {\r\n item.display = item.display.replace(\r\n new RegExp(data.queryData, 'g'),\r\n `<span>${data.queryData}</span>`\r\n );\r\n\r\n return item;\r\n });\r\n\r\n return selections;\r\n });\r\n\r\n // methods\r\n\r\n // 点击外部\r\n const handleClickOutside = () => {\r\n data.visibleMenu = false;\r\n };\r\n\r\n // 输入框数据改变\r\n const handleChangeInput = (value: string) => {\r\n data.queryData = value;\r\n };\r\n\r\n // 失去焦点\r\n const handleInputFocus = () => {\r\n input.value.focus(null);\r\n };\r\n\r\n // 关闭下拉框\r\n const handleClose = () => {\r\n data.visibleMenu = false;\r\n };\r\n\r\n // 打开菜单\r\n const handleToggleOpen = () => {\r\n // 是否禁用选择组件\r\n if (props.disabled) {\r\n return false;\r\n }\r\n\r\n // 是否显示菜单\r\n if (data.visibleMenu) {\r\n // 是否支持搜索\r\n if (!props.filterable) {\r\n handleClose();\r\n }\r\n } else {\r\n // 获取焦点\r\n handleFocus();\r\n }\r\n };\r\n\r\n // 结果变化\r\n const handleResultChange = (params: ResultChange) => {\r\n // lastValue: 是点击的最终值\r\n const lastValue = params.lastValue;\r\n // fromInit: 这是从更新值发出的\r\n const fromInit = params.fromInit;\r\n const changeOnSelect = params.changeOnSelect;\r\n\r\n // 点选每级菜单选项值都会发生变化\r\n if (lastValue || changeOnSelect) {\r\n const oldVal = JSON.stringify(data.currentValue);\r\n\r\n data.selected = data.tmpSelected;\r\n\r\n const newVal = [];\r\n data.selected.forEach((item) => {\r\n newVal.push(item.value);\r\n });\r\n\r\n if (!fromInit) {\r\n data.updatingValue = true;\r\n data.currentValue = newVal;\r\n\r\n // 发送事件\r\n emitValue(data.currentValue, oldVal);\r\n }\r\n }\r\n\r\n // 选择最后一项\r\n if (lastValue && !fromInit) {\r\n handleClose();\r\n }\r\n };\r\n\r\n // 清除选择数据\r\n const handleClearSelect = () => {\r\n // 是否禁用选择组件\r\n if (props.disabled) {\r\n return false;\r\n }\r\n\r\n // 当前值\r\n const oldVal = JSON.stringify(data.currentValue);\r\n data.currentValue = data.selected = data.tmpSelected = [];\r\n\r\n // 发送事件\r\n emitValue(data.currentValue, oldVal);\r\n\r\n // 关闭下拉框\r\n handleClose();\r\n\r\n setTimeout(() => {\r\n // 清除菜单选择数据\r\n menu.value.handleClear();\r\n }, 300);\r\n };\r\n\r\n // 获取焦点\r\n const handleFocus = () => {\r\n data.filterableSelect = true;\r\n\r\n data.visibleMenu = true;\r\n\r\n // 清除带单数据\r\n if (!data.currentValue.length) {\r\n menu.value.handleClear();\r\n }\r\n };\r\n\r\n // 选择搜索选项\r\n const handleSelectItem = (item: Options) => {\r\n // 禁用\r\n if (item.disabled || item.item.disabled) {\r\n return false;\r\n }\r\n\r\n // 清除搜索内容\r\n data.queryData = '';\r\n\r\n // 清除输入框\r\n input.value.handleClear();\r\n\r\n const oldVal = JSON.stringify(data.currentValue);\r\n data.currentValue = item.value.split(',');\r\n\r\n // 有当前数据\r\n if (data.currentValue.length) {\r\n updateSelected();\r\n }\r\n\r\n // 发送事件\r\n emitValue(data.currentValue, oldVal);\r\n\r\n data.filterableSelect = false;\r\n\r\n setTimeout(() => {\r\n // 关闭弹窗\r\n handleClose();\r\n });\r\n };\r\n\r\n // 排除 loading 后的 data,避免重复触发 updateSelect\r\n const getValidData = (data: Options[]) => {\r\n function deleteData(item: Options) {\r\n const new_item = Object.assign({}, item);\r\n if ('loading' in new_item) {\r\n delete new_item.loading;\r\n }\r\n\r\n if ('__value' in new_item) {\r\n delete new_item.__value;\r\n }\r\n\r\n if ('__label' in new_item) {\r\n delete new_item.__label;\r\n }\r\n\r\n if ('children' in new_item && new_item.children.length) {\r\n new_item.children = new_item.children.map((i) => deleteData(i));\r\n }\r\n return new_item;\r\n }\r\n\r\n return data.map((item: Options) => deleteData(item));\r\n };\r\n\r\n // 更新选项 触发菜单 handleFindSelected 方法\r\n const updateSelected = (init = false, changeOnSelectDataChange = false) => {\r\n // changeOnSelectDataChange 用于在数据更改和设置值时进行 changeOnSelect\r\n if (!props.changeOnSelect || init || changeOnSelectDataChange) {\r\n menu.value.handleFindSelected({\r\n value: data.currentValue,\r\n });\r\n }\r\n };\r\n\r\n // 更新结果\r\n const updateResult = (result: Result[]) => {\r\n data.tmpSelected = result;\r\n };\r\n\r\n // 发送事件\r\n const emitValue = (val: string[], oldVal: string) => {\r\n if (JSON.stringify(val) !== oldVal) {\r\n emit(\r\n 'on-change',\r\n data.currentValue,\r\n JSON.parse(JSON.stringify(data.selected))\r\n );\r\n }\r\n };\r\n\r\n // 监听菜单打开\r\n watch(\r\n () => data.visibleMenu,\r\n (value) => {\r\n if (value) {\r\n // 有当前数据\r\n if (data.currentValue.length) {\r\n updateSelected();\r\n }\r\n\r\n // 是否将弹层放置于 body 内,在 Tabs\r\n dropdown.value.update();\r\n } else {\r\n // 是否支持搜索\r\n if (props.filterable) {\r\n // 请求的输入下拉框动画结束后清除\r\n setTimeout(() => {\r\n data.queryData = '';\r\n input.value.handleClear();\r\n }, 300);\r\n }\r\n\r\n // 是否将弹层放置于 body 内,在 Tabs\r\n if (props.transfer) {\r\n dropdown.value.destroy();\r\n }\r\n }\r\n\r\n emit('on-visible-change', value);\r\n }\r\n );\r\n\r\n // 监听 modelValue\r\n watch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value === null) {\r\n data.isValueNull = true;\r\n }\r\n\r\n // 有当前数据\r\n data.currentValue = value || [];\r\n\r\n // 清除选择的数据\r\n if (value === null || !value.length) {\r\n data.selected = [];\r\n }\r\n }\r\n );\r\n\r\n // 监听当前的value\r\n watch(\r\n () => data.currentValue,\r\n (value: string[] | null) => {\r\n // 解决 value 置为 null 时,$emit:update:modelValue [] 而不是 null\r\n if (data.isValueNull) {\r\n data.isValueNull = false;\r\n\r\n emit('update:modelValue', null);\r\n } else {\r\n emit('update:modelValue', value);\r\n }\r\n\r\n if (data.updatingValue) {\r\n data.updatingValue = false;\r\n return;\r\n }\r\n\r\n // 更新选项\r\n updateSelected(true);\r\n }\r\n );\r\n\r\n // 监听可选项的数据源\r\n watch(\r\n () => props.options,\r\n () => {\r\n const validDataStr = JSON.stringify(getValidData(props.options));\r\n\r\n // 数据流不一样\r\n if (validDataStr !== data.validDataStr) {\r\n data.validDataStr = validDataStr;\r\n\r\n if (!data.isLoadedChildren) {\r\n nextTick(() => updateSelected(false, props.changeOnSelect));\r\n }\r\n\r\n // 加载子项\r\n data.isLoadedChildren = false;\r\n }\r\n },\r\n {\r\n deep: true,\r\n }\r\n );\r\n\r\n // provide\r\n provide(\r\n SelectContextKey,\r\n reactive({\r\n props,\r\n reference,\r\n })\r\n );\r\n\r\n // provide\r\n provide(\r\n CascaderContextKey,\r\n reactive({\r\n props,\r\n dropdown,\r\n data,\r\n updateResult,\r\n handleResultChange,\r\n })\r\n );\r\n\r\n return {\r\n prefixCls,\r\n\r\n // dom\r\n input,\r\n reference,\r\n dropdown,\r\n menu,\r\n\r\n // data\r\n data,\r\n\r\n // computed\r\n classes,\r\n inputClasses,\r\n displayRender,\r\n displayInputRender,\r\n inputPlaceholder,\r\n dropdownClasses,\r\n dropdownStyles,\r\n showCloseIcon,\r\n querySelections,\r\n\r\n // methods\r\n handleClickOutside,\r\n handleChangeInput,\r\n handleInputFocus,\r\n handleToggleOpen,\r\n handleClearSelect,\r\n handleSelectItem,\r\n updateResult,\r\n };\r\n },\r\n components: {\r\n IvueInput,\r\n IvueIcon,\r\n DropDown,\r\n IvueCascaderMenu,\r\n },\r\n});\r\n</script>\r\n"],"names":["_resolveDirective","_normalizeClass","_createCommentVNode","_createElementVNode","_renderSlot","_createVNode","_withCtx","_withDirectives","_withModifiers","_vShow","_toDisplayString","_Transition","_openBlock","_createBlock","_normalizeStyle","_createElementBlock","_Fragment","_renderList"],"mappings":"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"}