ivue-material-plus
Version:
A high quality UI components Library with Vue.js
1 lines • 24.2 kB
Source Map (JSON)
{"version":3,"file":"index2.mjs","sources":["../../../../../src/components/ivue-carousel/index.vue"],"sourcesContent":["<template>\r\n <div\r\n :class=\"wrapperClasses\"\r\n ref=\"wrapper\"\r\n @mouseenter.stop=\"handleMouseEnter\"\r\n @mouseleave.stop=\"handleMouseLeave\"\r\n >\r\n <div :class=\"`${prefixCls}-content`\" :style=\"contentStyles\">\r\n <!-- 左按钮 -->\r\n <transition v-if=\"arrowDisplay\" name=\"fade\">\r\n <ivue-button\r\n :class=\"[`${prefixCls}-arrow left`]\"\r\n flat\r\n icon\r\n @mouseenter=\"handleArrowEnter('left')\"\r\n @mouseleave=\"handleArrowLeave\"\r\n @click=\"handleArrowClick(data.activeIndex - 1)\"\r\n v-show=\"\r\n (arrow === 'always' || data.hover) && (loop || data.activeIndex > 0)\r\n \"\r\n >\r\n <slot name=\"leftArrow\">\r\n <ivue-icon>{{ leftArrow }}</ivue-icon>\r\n </slot>\r\n </ivue-button>\r\n </transition>\r\n\r\n <!-- slot -->\r\n <slot></slot>\r\n\r\n <!-- 右按钮 -->\r\n <transition v-if=\"arrowDisplay\" name=\"fade\">\r\n <ivue-button\r\n :class=\"[`${prefixCls}-arrow right`]\"\r\n flat\r\n icon\r\n @mouseenter=\"handleArrowEnter('right')\"\r\n @mouseleave=\"handleArrowLeave\"\r\n @click=\"handleArrowClick(data.activeIndex + 1)\"\r\n v-show=\"\r\n (arrow === 'always' || data.hover) &&\r\n (loop || data.activeIndex < data.items.length - 1)\r\n \"\r\n >\r\n <slot name=\"rightArrow\">\r\n <ivue-icon>{{ rightArrow }}</ivue-icon>\r\n </slot>\r\n </ivue-button>\r\n </transition>\r\n </div>\r\n <!-- 导航器 -->\r\n <ul :class=\"dotsClasses\">\r\n <li\r\n v-for=\"(item, index) in data.items\"\r\n :class=\"[\r\n `${prefixCls}-dots--dot`,\r\n {\r\n [`${prefixCls}-dots--active`]: index === data.activeIndex,\r\n },\r\n ]\"\r\n @mouseenter=\"handleThrottleDotHover(index)\"\r\n @click.stop=\"handleDotClick(index)\"\r\n :key=\"index\"\r\n >\r\n <button\r\n type=\"button\"\r\n :class=\"[\r\n `${prefixCls}-dots--button`,\r\n {\r\n [`${prefixCls}-dots--radius`]: radiusDot,\r\n },\r\n ]\"\r\n >\r\n <span :class=\"`${prefixCls}-dots--label`\">\r\n {{ item.props.label }}\r\n </span>\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\">\r\nimport {\r\n computed,\r\n defineComponent,\r\n onBeforeUnmount,\r\n onMounted,\r\n provide,\r\n reactive,\r\n ref,\r\n shallowRef,\r\n watch,\r\n} from 'vue';\r\nimport { useResizeObserver } from '@vueuse/core';\r\nimport { isString } from '@vue/shared';\r\nimport { throttle } from 'lodash-unified';\r\n\r\nimport { oneOf } from '../../utils/assist';\r\n\r\nimport IvueButton from '../ivue-button';\r\nimport IvueIcon from '../ivue-icon';\r\n\r\n// type\r\nimport { CarouselItemContext, Props, Data } from './types/carousel';\r\nimport { CarouselContextKey } from '../ivue-carousel-item/types/carousel-item';\r\n\r\nconst prefixCls = 'ivue-carousel';\r\n\r\nexport default defineComponent({\r\n name: prefixCls,\r\n emits: ['on-change'],\r\n props: {\r\n /**\r\n * carousel 的类型\r\n *\r\n * @type {String}\r\n */\r\n type: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['card']);\r\n },\r\n },\r\n /**\r\n * 展示的方向\r\n *\r\n * @type {String}\r\n */\r\n direction: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['vertical', 'horizontal']);\r\n },\r\n default: 'horizontal',\r\n },\r\n /**\r\n * 导航器竖向方向\r\n *\r\n * @type {String}\r\n */\r\n verticalDotsDirection: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['left', 'right']);\r\n },\r\n default: 'left',\r\n },\r\n /**\r\n * carousel 的高度\r\n *\r\n * @type {String}\r\n */\r\n height: {\r\n type: String,\r\n },\r\n /**\r\n * 是否循环显示\r\n *\r\n * @type {Boolean}\r\n */\r\n loop: {\r\n type: Boolean,\r\n default: true,\r\n },\r\n /**\r\n * 初始状态激活的幻灯片的索引,从 0 开始\r\n *\r\n * @type {Number}\r\n */\r\n initialIndex: {\r\n type: Number,\r\n default: 0,\r\n },\r\n /**\r\n * 左箭头图标\r\n *\r\n * @type {String}\r\n */\r\n leftArrow: {\r\n type: String,\r\n default: 'keyboard_arrow_left',\r\n },\r\n /**\r\n * 右箭头图标\r\n *\r\n * @type {String}\r\n */\r\n rightArrow: {\r\n type: String,\r\n default: 'keyboard_arrow_right',\r\n },\r\n /**\r\n * 切换箭头显示时机\r\n *\r\n * @type {String}\r\n *\r\n * hover(悬停),always(一直显示),never(不显示)\r\n */\r\n arrow: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['hover', 'always', 'never']);\r\n },\r\n default: 'always',\r\n },\r\n /**\r\n * 指示器的位置,可选值为 inside (内部),outside(外部),none(不显示)\r\n *\r\n * @type {String}\r\n */\r\n dots: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['inside', 'outside', 'none']);\r\n },\r\n default: 'inside',\r\n },\r\n /**\r\n * 是否显示圆形指示器\r\n *\r\n * @type {Boolean}\r\n */\r\n radiusDot: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 节流时间 (作用于 prev,next,handleArrowClick 方法 )\r\n *\r\n * @type {Number}\r\n */\r\n throttleTime: {\r\n type: Number,\r\n default: 300,\r\n },\r\n /**\r\n * 指示器的触发方式\r\n *\r\n * @type {String}\r\n */\r\n trigger: {\r\n type: String,\r\n validator(value: string) {\r\n return oneOf(value, ['hover', 'click']);\r\n },\r\n default: 'click',\r\n },\r\n /**\r\n * 是否自动切换\r\n *\r\n * @type {Boolean}\r\n */\r\n autoplay: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 自动切换的时间间隔,单位为毫秒\r\n *\r\n * @type {Number}\r\n */\r\n interval: {\r\n type: Number,\r\n default: 3000,\r\n },\r\n /**\r\n * 鼠标悬浮时暂停自动切换\r\n *\r\n * @type {Boolean}\r\n */\r\n pauseOnHover: {\r\n type: Boolean,\r\n default: false,\r\n },\r\n /**\r\n * 卡片缩放大小\r\n *\r\n * @type {Number}\r\n */\r\n cardScale: {\r\n type: Number,\r\n default: 0.83,\r\n },\r\n },\r\n setup(props: Props, { emit }) {\r\n // dom\r\n\r\n // wrapper\r\n const wrapper = ref<HTMLDivElement>();\r\n\r\n // data\r\n const data = reactive<Data>({\r\n /**\r\n * 选项数量\r\n *\r\n * @type {Array}\r\n */\r\n items: [],\r\n /**\r\n * 激活的选项\r\n *\r\n * @type {Number}\r\n */\r\n activeIndex: -1,\r\n /**\r\n * 鼠标进入\r\n *\r\n * @type {Boolean}\r\n */\r\n hover: false,\r\n /**\r\n * setInterval\r\n *\r\n * @type {Function}\r\n */\r\n timer: null,\r\n /**\r\n * 内容高度\r\n *\r\n * @type {Number}\r\n */\r\n contentHeight: 0,\r\n /**\r\n * 是否初始化完毕\r\n *\r\n * @type {Boolean}\r\n */\r\n init: false,\r\n });\r\n\r\n // computed\r\n\r\n // 外层样式\r\n const wrapperClasses = computed(() => {\r\n return [\r\n prefixCls,\r\n {\r\n // 展示的方向\r\n [`${prefixCls}-${props.direction}`]: true,\r\n // 卡片类型\r\n [`${prefixCls}-card`]: isCardType.value,\r\n // 没有初始化完成\r\n [`${prefixCls}-no-init`]: !data.init,\r\n },\r\n ];\r\n });\r\n\r\n // 内容样式\r\n const contentStyles = computed(() => {\r\n // 自定义高度\r\n if (props.height !== 'auto') {\r\n return {\r\n height: props.height,\r\n };\r\n }\r\n\r\n // 高度auto\r\n return {\r\n height: `${data.contentHeight}px`,\r\n overflow: 'hidden',\r\n };\r\n });\r\n\r\n // 是否是垂直\r\n const isVertical = computed(() => {\r\n return props.direction === 'vertical';\r\n });\r\n\r\n // 是否是卡片类型\r\n const isCardType = computed(() => {\r\n return props.type === 'card';\r\n });\r\n\r\n // 按钮禁用\r\n const arrowDisplay = computed(() => {\r\n return props.arrow !== 'never' && !isVertical.value;\r\n });\r\n\r\n // dots 样式\r\n const dotsClasses = computed(() => {\r\n return [\r\n `${prefixCls}-dots`,\r\n // 指示器的位置\r\n `${prefixCls}-dots--${props.dots}`,\r\n {\r\n // 指示器文字\r\n [`${prefixCls}-dots--labels`]: hasLabel.value,\r\n // 指示器竖向\r\n [`${prefixCls}-dots--vertical`]: isVertical.value,\r\n // 指示器竖向时方向位置\r\n [`${prefixCls}-dots--${props.verticalDotsDirection}`]:\r\n isVertical.value,\r\n // 卡片类型指示器使用 outside\r\n [`${prefixCls}-dots--outside`]: isCardType.value && !isVertical.value,\r\n },\r\n ];\r\n });\r\n\r\n // 该幻灯片所对应指示器的文本\r\n const hasLabel = computed(() => {\r\n return data.items.some((item) => item.props.label.toString().length > 0);\r\n });\r\n\r\n // methods\r\n\r\n // 激活选项\r\n const setActiveItem = (index: number | string) => {\r\n // index 是 字符串\r\n if (isString(index)) {\r\n // 通过幻灯片的名字查找下标\r\n const filteredItems = data.items.filter(\r\n (item) => item.props.name === index\r\n );\r\n\r\n // 过滤选项获取对应的index\r\n if (filteredItems.length > 0) {\r\n index = data.items.indexOf(filteredItems[0]);\r\n }\r\n }\r\n\r\n // index\r\n index = Number(index);\r\n\r\n // 是否是整数\r\n if (Number.isNaN(index) || index !== Math.floor(index)) {\r\n // eslint-disable-next-line no-console\r\n console.warn('index must be integer');\r\n\r\n return;\r\n }\r\n\r\n // 选项长度\r\n const itemsLength = data.items.length;\r\n\r\n // 之前激活的下标\r\n const oldIndex = data.activeIndex;\r\n\r\n // 指向最后一个下标\r\n if (index < 0) {\r\n data.activeIndex = props.loop ? itemsLength - 1 : 0;\r\n }\r\n // 指向最后一个\r\n else if (index >= itemsLength) {\r\n data.activeIndex = props.loop ? 0 : itemsLength - 1;\r\n }\r\n // 其他\r\n else {\r\n data.activeIndex = index;\r\n }\r\n\r\n // 上一个下标 === 当前激活的下标\r\n if (oldIndex === data.activeIndex) {\r\n // 重置选项位置\r\n resetItemPosition(oldIndex);\r\n }\r\n\r\n // 重置倒计时\r\n resetTimer();\r\n };\r\n\r\n // 添加选项\r\n const addItem = (item: CarouselItemContext) => {\r\n data.items.push(item);\r\n };\r\n\r\n // 删除选项\r\n const removeItem = (uid?: number) => {\r\n const index = data.items.findIndex((item) => item.uid === uid);\r\n\r\n // 删除\r\n if (index !== -1) {\r\n data.items.splice(index, 1);\r\n\r\n // 设置下一个激活选项\r\n if (data.activeIndex === index) {\r\n next();\r\n }\r\n }\r\n };\r\n\r\n // 激活上一个选项\r\n const prev = throttle(\r\n () => {\r\n setActiveItem(data.activeIndex - 1);\r\n },\r\n props.throttleTime,\r\n { trailing: true }\r\n );\r\n\r\n // 激活下一个选项\r\n const next = throttle(\r\n () => {\r\n setActiveItem(data.activeIndex + 1);\r\n },\r\n props.throttleTime,\r\n { trailing: true }\r\n );\r\n\r\n // 重置选项位置\r\n const resetItemPosition = (oldIndex?: number) => {\r\n data.items.forEach((item, index) => {\r\n // 移动选项\r\n item.translateItem(index, data.activeIndex, oldIndex);\r\n });\r\n };\r\n\r\n // 按钮点击\r\n const handleArrowClick = throttle(\r\n (index: number) => {\r\n setActiveItem(index);\r\n },\r\n props.throttleTime,\r\n { trailing: true }\r\n );\r\n\r\n // 开始自动切换\r\n const startTimer = () => {\r\n // 自动切换的时间间隔,单位为毫秒 < 0 | 没有开启自动切换 | 已经存在倒计时\r\n if (props.interval <= 0 || !props.autoplay || data.timer) {\r\n return;\r\n }\r\n\r\n data.timer = setInterval(() => {\r\n // 激活的选项 < 选项数量\r\n if (data.activeIndex < data.items.length - 1) {\r\n data.activeIndex += 1;\r\n }\r\n // 开启循环\r\n else if (props.loop) {\r\n data.activeIndex = 0;\r\n }\r\n }, props.interval);\r\n };\r\n\r\n // 停止自动切换\r\n const pauseTimer = () => {\r\n if (data.timer) {\r\n clearInterval(data.timer);\r\n\r\n data.timer = null;\r\n }\r\n };\r\n\r\n // 监听缩放->浅拷贝 useResizeObserver\r\n const resizeObserver = shallowRef<ReturnType<typeof useResizeObserver>>();\r\n\r\n // 鼠标进入\r\n const handleMouseEnter = () => {\r\n data.hover = true;\r\n\r\n // 鼠标悬浮时暂停自动切换\r\n if (props.pauseOnHover) {\r\n pauseTimer();\r\n }\r\n };\r\n\r\n // 鼠标离开\r\n const handleMouseLeave = () => {\r\n data.hover = false;\r\n\r\n startTimer();\r\n };\r\n\r\n // 点击导航器\r\n const handleDotClick = (index: number) => {\r\n data.activeIndex = index;\r\n };\r\n\r\n // 导航器hover\r\n const handleDotHover = (index: number) => {\r\n if (props.trigger === 'hover' && index !== data.activeIndex) {\r\n data.activeIndex = index;\r\n }\r\n };\r\n\r\n // 导航器hover\r\n const handleThrottleDotHover = throttle((index: number) => {\r\n handleDotHover(index);\r\n }, props.throttleTime);\r\n\r\n // 设置内容高度\r\n const setContentHeight = (height: number) => {\r\n if (props.height !== 'auto') {\r\n return;\r\n }\r\n\r\n data.contentHeight = height;\r\n };\r\n\r\n // 按钮鼠标进入\r\n const handleArrowEnter = (arrow: 'left' | 'right') => {\r\n // 是否是垂直\r\n if (isVertical.value) {\r\n return;\r\n }\r\n\r\n data.items.forEach((item, index) => {\r\n // 设置卡片hover\r\n if (arrow === itemInStage(item, index)) {\r\n item.states.hover = true;\r\n }\r\n });\r\n };\r\n\r\n // 按钮鼠标离开\r\n const handleArrowLeave = () => {\r\n // 是否是垂直\r\n if (isVertical.value) {\r\n return;\r\n }\r\n\r\n // 取消选项的hover\r\n data.items.forEach((item) => {\r\n item.states.hover = false;\r\n });\r\n };\r\n\r\n // 选项是否可以点击下一个\r\n const itemInStage = (item: CarouselItemContext, index: number) => {\r\n const items = [...data.items];\r\n const itemLength = items.length;\r\n\r\n // 没有选项 || 没有下一个\r\n if (itemLength === 0 || !item.states.inStage) {\r\n return false;\r\n }\r\n\r\n // 上一个选项的index\r\n const prevItemIndex = index - 1;\r\n // 下一个选项的index\r\n const nextItemIndex = index + 1;\r\n // 最后一个选项的index\r\n const lastItemIndex = itemLength - 1;\r\n\r\n // 最后一个选项激活\r\n const isLastItemActive = items[lastItemIndex].states.active;\r\n // 第一个选项激活\r\n const isFirstItemActive = items[0].states.active;\r\n // 上一个选项激活\r\n const isPrevItemActive = items[prevItemIndex]?.states?.active;\r\n // 下一个选项激活\r\n const isNextItemActive = items[nextItemIndex]?.states?.active;\r\n\r\n // 当前选项 === 最后一个选项 && 第一个选项激活 || 下一个选项激活 -> 选择的是左边\r\n if ((index === lastItemIndex && isFirstItemActive) || isNextItemActive) {\r\n return 'left';\r\n }\r\n // index === 0 && 最后一个选项激活 || 上一个选项激活 -> 选择的是右边\r\n else if ((index === 0 && isLastItemActive) || isPrevItemActive) {\r\n return 'right';\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // 重置倒计时\r\n const resetTimer = () => {\r\n pauseTimer();\r\n startTimer();\r\n };\r\n\r\n // provide\r\n provide(CarouselContextKey, {\r\n // dom\r\n wrapper,\r\n\r\n // data\r\n items: ref(data.items),\r\n loop: props.loop,\r\n cardScale: props.cardScale,\r\n\r\n // computed\r\n // 是否是垂直\r\n isVertical,\r\n // 是否是卡片类型\r\n isCardType,\r\n\r\n // methods\r\n // 添加选项\r\n addItem,\r\n // 删除选项\r\n removeItem,\r\n // 设置内容高度\r\n setContentHeight,\r\n // 激活选项\r\n setActiveItem,\r\n });\r\n\r\n // watch\r\n\r\n // 监听激活的选项\r\n watch(\r\n () => data.activeIndex,\r\n (current, prev) => {\r\n // 重置选项位置\r\n resetItemPosition(prev);\r\n\r\n // 改变了\r\n if (prev > -1) {\r\n emit('on-change', current, prev);\r\n }\r\n }\r\n );\r\n\r\n // 监听是否自动切换\r\n watch(\r\n () => props.autoplay,\r\n (value) => {\r\n value ? startTimer() : pauseTimer();\r\n }\r\n );\r\n\r\n // 监听是否循环显示\r\n watch(\r\n () => props.loop,\r\n () => {\r\n setActiveItem(data.activeIndex);\r\n }\r\n );\r\n\r\n // 监听自动切换的时间间隔,单位为毫秒\r\n watch(\r\n () => props.interval,\r\n () => {\r\n resetTimer();\r\n }\r\n );\r\n\r\n // onMounted\r\n onMounted(() => {\r\n resizeObserver.value = useResizeObserver(wrapper.value, () => {\r\n // 重置选项位置\r\n resetItemPosition();\r\n });\r\n\r\n // 设置激活的选项\r\n if (props.initialIndex < data.items.length && props.initialIndex >= 0) {\r\n data.activeIndex = props.initialIndex;\r\n }\r\n\r\n // 开始自动切换\r\n startTimer();\r\n\r\n // 已经完成初始化\r\n setTimeout(() => {\r\n data.init = true;\r\n });\r\n });\r\n\r\n // onBeforeUnmount\r\n onBeforeUnmount(() => {\r\n // 停止监听缩放\r\n if (wrapper.value && resizeObserver.value) {\r\n resizeObserver.value.stop();\r\n }\r\n });\r\n\r\n return {\r\n prefixCls,\r\n\r\n // dom\r\n wrapper,\r\n\r\n // data\r\n data,\r\n\r\n // computed\r\n wrapperClasses,\r\n arrowDisplay,\r\n dotsClasses,\r\n contentStyles,\r\n\r\n // methods\r\n handleMouseEnter,\r\n handleMouseLeave,\r\n handleArrowClick,\r\n handleDotClick,\r\n handleThrottleDotHover,\r\n handleArrowEnter,\r\n handleArrowLeave,\r\n setActiveItem,\r\n prev,\r\n next,\r\n };\r\n },\r\n components: {\r\n IvueButton,\r\n IvueIcon,\r\n },\r\n});\r\n</script>\r\n"],"names":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_withModifiers","_normalizeStyle","_createCommentVNode","_createBlock","_Transition","_withCtx","_withDirectives","_createVNode","_renderSlot","_vShow","_createElementVNode","_Fragment","_renderList"],"mappings":"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"}