|
@@ -1,309 +0,0 @@
|
|
|
-import {
|
|
|
- defineComponent,
|
|
|
- computed,
|
|
|
- nextTick,
|
|
|
- onBeforeMount,
|
|
|
- getCurrentInstance,
|
|
|
- unref
|
|
|
-} from "vue"
|
|
|
-import { addClass, removeClass, toggleClass } from "/@/utils/operate"
|
|
|
-import "./index.css"
|
|
|
-
|
|
|
-let stayClass = "stay" //鼠标点击
|
|
|
-let activeClass = "hs-on" //鼠标移动上去
|
|
|
-let voidClass = "hs-off" //鼠标移开
|
|
|
-let inRange = "hs-range" //当前选中的两个元素之间的背景
|
|
|
-let bothLeftSides = "both-left-sides"
|
|
|
-let bothRightSides = "both-right-sides"
|
|
|
-let selectedDirection = "right" //默认从左往右,索引变大
|
|
|
-
|
|
|
-let overList = []
|
|
|
-// 存放第一个选中的元素和最后一个选中元素,只能存放这两个元素
|
|
|
-let selectedList = []
|
|
|
-
|
|
|
-export default defineComponent({
|
|
|
- name: "Selector",
|
|
|
- props: {
|
|
|
- HsKey: {
|
|
|
- type: Number || String,
|
|
|
- default: 0,
|
|
|
- },
|
|
|
- disabled: {
|
|
|
- type: Boolean,
|
|
|
- default: false,
|
|
|
- },
|
|
|
- value: {
|
|
|
- type: Number,
|
|
|
- default: 0,
|
|
|
- },
|
|
|
- max: {
|
|
|
- type: Array,
|
|
|
- default: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
|
- },
|
|
|
- // 回显数据的索引,长度必须是2
|
|
|
- echo: {
|
|
|
- type: Array,
|
|
|
- default: [],
|
|
|
- },
|
|
|
- },
|
|
|
- emits: ["selectedVal"],
|
|
|
- setup(props, { emit }) {
|
|
|
- let vm: any
|
|
|
- let currentValue = props.value
|
|
|
-
|
|
|
- let rateDisabled = computed(() => {
|
|
|
- return props.disabled
|
|
|
- })
|
|
|
-
|
|
|
- let classes = computed(() => {
|
|
|
- let result = []
|
|
|
- let i = 0
|
|
|
- let threshold = currentValue
|
|
|
- if (currentValue !== Math.floor(currentValue)) {
|
|
|
- threshold--
|
|
|
- }
|
|
|
- for (; i < threshold; i++) {
|
|
|
- result.push(activeClass)
|
|
|
- }
|
|
|
- for (; i < props.max.length; i++) {
|
|
|
- result.push(voidClass)
|
|
|
- }
|
|
|
- return result
|
|
|
- })
|
|
|
-
|
|
|
- // 鼠标移入
|
|
|
- const setCurrentValue = (index) => {
|
|
|
- if (props.disabled) return
|
|
|
- // 当选中一个元素后,开始添加背景色
|
|
|
- if (selectedList.length === 1) {
|
|
|
- if (overList.length < 1) overList.push({ index })
|
|
|
-
|
|
|
- let firstIndex = overList[0].index
|
|
|
-
|
|
|
- // 往右走,索引变大
|
|
|
- if (index > firstIndex) {
|
|
|
- selectedDirection = "right"
|
|
|
- toggleClass(
|
|
|
- false,
|
|
|
- bothRightSides,
|
|
|
- document.querySelector(".hs-select__item" + selectedList[0].index)
|
|
|
- )
|
|
|
-
|
|
|
- while (index >= firstIndex) {
|
|
|
- addClass(
|
|
|
- document.querySelector(".hs-select__item" + firstIndex),
|
|
|
- inRange
|
|
|
- )
|
|
|
- firstIndex++
|
|
|
- }
|
|
|
- } else {
|
|
|
- selectedDirection = "left"
|
|
|
- toggleClass(
|
|
|
- true,
|
|
|
- bothRightSides,
|
|
|
- document.querySelector(".hs-select__item" + selectedList[0].index)
|
|
|
- )
|
|
|
-
|
|
|
- while (index <= firstIndex) {
|
|
|
- addClass(
|
|
|
- document.querySelector(".hs-select__item" + firstIndex),
|
|
|
- inRange
|
|
|
- )
|
|
|
- firstIndex--
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- addClass(document.querySelector("." + voidClass + index), activeClass)
|
|
|
- }
|
|
|
-
|
|
|
- // 鼠标离开
|
|
|
- const resetCurrentValue = (index) => {
|
|
|
- if (props.disabled) return
|
|
|
- // 移除先检查是否选中 选中则返回false 不移除
|
|
|
- const currentHsDom = document.querySelector("." + voidClass + index)
|
|
|
- if (currentHsDom.className.includes(stayClass)) {
|
|
|
- return false
|
|
|
- } else {
|
|
|
- removeClass(currentHsDom, activeClass)
|
|
|
- }
|
|
|
-
|
|
|
- // 当选中一个元素后,开始移除背景色
|
|
|
- if (selectedList.length === 1) {
|
|
|
- let firstIndex = overList[0].index
|
|
|
- if (index >= firstIndex) {
|
|
|
- for (let i = 0; i <= index; i++) {
|
|
|
- removeClass(
|
|
|
- document.querySelector(".hs-select__item" + i),
|
|
|
- inRange
|
|
|
- )
|
|
|
- }
|
|
|
- } else {
|
|
|
- while (index <= firstIndex) {
|
|
|
- removeClass(
|
|
|
- document.querySelector(".hs-select__item" + index),
|
|
|
- inRange
|
|
|
- )
|
|
|
- index++
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 鼠标点击
|
|
|
- const selectValue = (index, item) => {
|
|
|
- if (props.disabled) return
|
|
|
- let len = selectedList.length
|
|
|
-
|
|
|
- if (len < 2) {
|
|
|
- selectedList.push({ item, index })
|
|
|
- addClass(document.querySelector("." + voidClass + index), stayClass)
|
|
|
-
|
|
|
- addClass(
|
|
|
- document.querySelector(".hs-select__item" + selectedList[0].index),
|
|
|
- bothLeftSides
|
|
|
- )
|
|
|
-
|
|
|
- if (selectedList[1]) {
|
|
|
- if (selectedDirection === "right") {
|
|
|
- addClass(
|
|
|
- document.querySelector(
|
|
|
- ".hs-select__item" + selectedList[1].index
|
|
|
- ),
|
|
|
- bothRightSides
|
|
|
- )
|
|
|
- } else {
|
|
|
- addClass(
|
|
|
- document.querySelector(
|
|
|
- ".hs-select__item" + selectedList[1].index
|
|
|
- ),
|
|
|
- bothLeftSides
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (len === 1) {
|
|
|
- // 顺时针排序
|
|
|
- if (selectedDirection === "right") {
|
|
|
- emit("selectedVal", {
|
|
|
- left: selectedList[0].item,
|
|
|
- right: selectedList[1].item,
|
|
|
- whole: selectedList,
|
|
|
- })
|
|
|
- } else {
|
|
|
- emit("selectedVal", {
|
|
|
- left: selectedList[1].item,
|
|
|
- right: selectedList[0].item,
|
|
|
- whole: selectedList,
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- nextTick(() => {
|
|
|
- selectedList.forEach((v) => {
|
|
|
- removeClass(
|
|
|
- document.querySelector("." + voidClass + v.index),
|
|
|
- activeClass,
|
|
|
- stayClass
|
|
|
- )
|
|
|
-
|
|
|
- removeClass(
|
|
|
- document.querySelector(".hs-select__item" + v.index),
|
|
|
- bothLeftSides,
|
|
|
- bothRightSides
|
|
|
- )
|
|
|
- })
|
|
|
-
|
|
|
- selectedList = []
|
|
|
- overList = []
|
|
|
- for (let i = 0; i <= props.max.length; i++) {
|
|
|
- let currentDom = document.querySelector(".hs-select__item" + i)
|
|
|
- if (currentDom) {
|
|
|
- removeClass(currentDom, inRange)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- selectedList.push({ item, index })
|
|
|
- addClass(document.querySelector("." + voidClass + index), stayClass)
|
|
|
-
|
|
|
- addClass(
|
|
|
- document.querySelector(".hs-select__item" + selectedList[0].index),
|
|
|
- bothLeftSides
|
|
|
- )
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 回显数据
|
|
|
- const echoView = (item) => {
|
|
|
- if (item.length === 0) return
|
|
|
-
|
|
|
- if (item.length > 2 || item.length === 1) {
|
|
|
- throw "传入的数组长度必须是2"
|
|
|
- }
|
|
|
-
|
|
|
- item.sort((a, b) => {
|
|
|
- return a - b
|
|
|
- })
|
|
|
-
|
|
|
- addClass(
|
|
|
- vm.refs["hsdiv" + props.HsKey + item[0]],
|
|
|
- activeClass,
|
|
|
- stayClass
|
|
|
- )
|
|
|
-
|
|
|
- addClass(vm.refs["hstd" + props.HsKey + item[0]], bothLeftSides)
|
|
|
-
|
|
|
- addClass(
|
|
|
- vm.refs["hsdiv" + props.HsKey + item[1]],
|
|
|
- activeClass,
|
|
|
- stayClass
|
|
|
- )
|
|
|
-
|
|
|
- addClass(vm.refs["hstd" + props.HsKey + item[1]], bothRightSides)
|
|
|
-
|
|
|
- while (item[1] >= item[0]) {
|
|
|
- addClass(vm.refs["hstd" + props.HsKey + item[0]], inRange)
|
|
|
- item[0]++
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- onBeforeMount(() => {
|
|
|
- vm = getCurrentInstance()
|
|
|
- nextTick(() => {
|
|
|
- echoView(props.echo)
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
- return () => (
|
|
|
- <>
|
|
|
- <table cellspacing="0" cellpadding="0">
|
|
|
- <tbody>
|
|
|
- <tr>
|
|
|
- {
|
|
|
- props.max.map((item, key) => {
|
|
|
- return <td
|
|
|
- data-index={props.HsKey}
|
|
|
- ref={`hstd${props.HsKey}${key}`}
|
|
|
- class={`hs-select__item${key}`}
|
|
|
- onMousemove={() => setCurrentValue(key)}
|
|
|
- onMouseleave={() => resetCurrentValue(key)}
|
|
|
- onClick={() => selectValue(key, item)}
|
|
|
- style={{
|
|
|
- cursor: unref(rateDisabled) ? 'auto' : 'pointer', textAlign: 'center'
|
|
|
- }}
|
|
|
- key={key}
|
|
|
- >
|
|
|
- <div ref={`hsdiv${props.HsKey}${key}`} class={`hs-item ${[unref(classes)[key] + key]}`}>
|
|
|
- <span>{item}</span>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- })
|
|
|
- }
|
|
|
- </tr>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </>
|
|
|
- )
|
|
|
- }
|
|
|
-})
|