fix: temporary storage

This commit is contained in:
xiaoxian521 2021-04-12 18:01:20 +08:00
parent 68330026b6
commit 78d9c17201
7 changed files with 225 additions and 5 deletions

View File

@ -0,0 +1,180 @@
<template>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td
v-for="(item, key) in max"
:class="['hs-select__item' + key]"
@mousemove="setCurrentValue(key, $event)"
@mouseleave="resetCurrentValue(key)"
@click="selectValue(key, item)"
:style="{ cursor: rateDisabled ? 'auto' : 'pointer', 'text-align': 'center' }"
:key="key"
>
<div :class="[classes[key] + key]" class="hs-item">
<span>22</span>
</div>
</td>
</tr>
</tbody>
</table>
</template>
<script lang='ts'>
import { defineComponent, computed, nextTick } from "vue";
import { addClass, removeClass } from "../../utils/operate/index";
import { useDebounceFn } from "@vueuse/core";
//
let stayClass = "stay"; //
let activeClass = "hs-on"; //
let voidClass = "hs-off"; //
let inRange = "hs-range"; //
//
let selectedList = [];
let overList = [];
export default defineComponent({
props: {
disabled: {
type: Boolean,
default: false,
},
value: {
type: Number,
default: 0,
},
max: {
type: Number,
default: 10,
},
},
setup(props, { emit }) {
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; i++) {
result.push(voidClass);
}
return result;
});
const setCurrentValue = (index, event) => {
//
if (selectedList.length === 1) {
overList.push({ index });
// let i = 0;
let firstIndex = overList[0].index;
//
if (index > firstIndex) {
// console.log(index, firstIndex);
let leftIndex = index - firstIndex;
for (var i =0; i < index; i++) {
// useDebounceFn(() => {
if(document.querySelector(".hs-select__item" + (i+index))) {
addClass(document.querySelector(".hs-select__item" + (i+index)), inRange);
}
// }, 100)();
}
} else {
}
}
addClass(document.querySelector("." + voidClass + index), activeClass);
};
const resetCurrentValue = (index) => {
// false
const currentHsDom = document.querySelector("." + voidClass + index);
if (currentHsDom.className.includes(stayClass)) {
return false;
} else {
removeClass(currentHsDom, activeClass);
}
//
if (selectedList.length === 1) {
for (let i = 0; i <= index; i++) {
removeClass(document.querySelector(".hs-select__item" + i), inRange);
}
}
};
const selectValue = (index, item) => {
let len = selectedList.length;
if (len < 2) {
selectedList.push({ item, index });
addClass(document.querySelector("." + voidClass + index), stayClass);
// let rangeDom = document.querySelector(".hs-select__item" + index)
} else {
nextTick(() => {
selectedList.forEach((v) => {
removeClass(
document.querySelector("." + voidClass + v.index),
activeClass,
stayClass
);
});
selectedList = [];
for (let i = 0; i <= props.max; i++) {
let currentDom = document.querySelector(".hs-select__item" + i);
if (currentDom) {
removeClass(currentDom, inRange);
}
}
});
}
};
return {
rateDisabled,
setCurrentValue,
resetCurrentValue,
selectValue,
classes,
};
},
});
</script>
<style scoped>
.hs-rate__icon {
font-size: 18px;
transition: 0.3s;
}
.hs-item {
width: 30px;
height: 30px;
box-sizing: border-box;
line-height: 30px;
}
.hs-on {
background-color: #409eff;
border-radius: 50%;
}
.hs-range {
background-color: #ccc;
}
</style>

View File

@ -35,7 +35,7 @@ export function useDynamicRoutesHook() {
let pathConcat = parentPath + '/' + arrItem.path
if (arrItem.path === value || pathConcat === value) {
dynamic.dRoutes.push({ path: value, meta: arrItem.meta })
console.log(dynamic.dRoutes)
// console.log(dynamic.dRoutes)
} else {
if (arrItem.children && arrItem.children.length > 0) {
concatPath(arrItem.children, value, parentPath)

View File

@ -16,5 +16,6 @@
"split-pane": "切割面板",
"button": "按钮组件",
"cropping": "图片裁剪",
"countTo": "数字动画"
"countTo": "数字动画",
"selector": "选择器组件"
}

View File

@ -16,5 +16,6 @@
"split-pane": "Split Pane",
"button": "Button Components",
"cropping": "Picture Cropping",
"countTo": "Digital Animation"
"countTo": "Digital Animation",
"selector": "Selector Components"
}

View File

@ -94,6 +94,15 @@ const routes: Array<RouteRecordRaw> = [
showLink: false,
savedPosition: true
}
},
{
path: '/components/selector',
component: () => import(/* webpackChunkName: "components" */ '../views/components/selector/index.vue'),
meta: {
title: 'selector',
showLink: false,
savedPosition: true
}
}
],
meta: {

View File

@ -6,9 +6,15 @@ export const addClass = (ele: Element, cls:string) :any => {
if (!hasClass(ele, cls)) ele.className += ' ' + cls
}
export const removeClass =(ele: Element, cls:string) :any => {
export const removeClass =(ele: Element, cls:string, extracls?: string) :any => {
if (hasClass(ele, cls)) {
const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
ele.className = ele.className.replace(reg, ' ')
ele.className = ele.className.replace(reg, ' ').trim()
}
if (extracls) {
if (hasClass(ele, extracls)) {
const regs = new RegExp('(\\s|^)' + extracls + '(\\s|$)')
ele.className = ele.className.replace(regs, ' ').trim()
}
}
}

View File

@ -0,0 +1,23 @@
<template>
<el-card class="box-card" style="margin:20px">
<template #header>
<div class="card-header">
<span>基本使用</span>
</div>
</template>
<Selector />
</el-card>
</template>
<script lang='ts'>
import Selector from "../../../components/selector/index.vue";
export default {
components: { Selector },
setup() {
return {};
},
};
</script>
<style scoped>
</style>