fix: fix some bug

This commit is contained in:
xiaoxian521
2021-04-13 22:49:03 +08:00
parent 1d1663e4ba
commit e027fec6dc
8 changed files with 239 additions and 34 deletions

View File

@@ -0,0 +1,10 @@
import { App } from "vue"
import countTo from "./src/countTo"
export const CountTo = Object.assign(countTo, {
install(app: App) {
app.component(countTo.name, countTo)
}
})
export default CountTo

View File

@@ -0,0 +1,173 @@
import {
defineComponent,
reactive,
computed,
watch,
onMounted,
unref,
toRef
} from "vue"
import { countToProps } from "./props"
import { isNumber } from "/@/utils/is"
export default defineComponent({
name: "CountTo",
props: countToProps,
emits: ["mounted", "callback"],
setup(props, { emit }) {
const state = reactive<{
localStartVal: number
printVal: number | null
displayValue: string
paused: boolean
localDuration: number | null
startTime: number | null
timestamp: number | null
rAF: any
remaining: number | null
color: any
fontSize: string
}>({
localStartVal: props.startVal,
displayValue: formatNumber(props.startVal),
printVal: null,
paused: false,
localDuration: props.duration,
startTime: null,
timestamp: null,
remaining: null,
rAF: null,
color: null,
fontSize: "16px"
})
const getCountDown = computed(() => {
return props.startVal > props.endVal
})
watch([() => props.startVal, () => props.endVal], () => {
if (props.autoplay) {
start()
}
})
function start() {
const { startVal, duration, color, fontSize } = props
state.localStartVal = startVal
state.startTime = null
state.localDuration = duration
state.paused = false
state.color = color
state.fontSize = fontSize
state.rAF = requestAnimationFrame(count)
}
function pauseResume() {
if (state.paused) {
resume()
state.paused = false
} else {
pause()
state.paused = true
}
}
function pause() {
cancelAnimationFrame(state.rAF)
}
function resume() {
state.startTime = null
state.localDuration = +(state.remaining as number)
state.localStartVal = +(state.printVal as number)
requestAnimationFrame(count)
}
function reset() {
state.startTime = null
cancelAnimationFrame(state.rAF)
state.displayValue = formatNumber(props.startVal)
}
function count(timestamp: number) {
const { useEasing, easingFn, endVal } = props
if (!state.startTime) state.startTime = timestamp
state.timestamp = timestamp
const progress = timestamp - state.startTime
state.remaining = (state.localDuration as number) - progress
if (useEasing) {
if (unref(getCountDown)) {
state.printVal =
state.localStartVal -
easingFn(
progress,
0,
state.localStartVal - endVal,
state.localDuration as number
)
} else {
state.printVal = easingFn(
progress,
state.localStartVal,
endVal - state.localStartVal,
state.localDuration as number
)
}
} else {
if (unref(getCountDown)) {
state.printVal =
state.localStartVal -
(state.localStartVal - endVal) *
(progress / (state.localDuration as number))
} else {
state.printVal =
state.localStartVal +
(endVal - state.localStartVal) *
(progress / (state.localDuration as number))
}
}
if (unref(getCountDown)) {
state.printVal = state.printVal < endVal ? endVal : state.printVal
} else {
state.printVal = state.printVal > endVal ? endVal : state.printVal
}
state.displayValue = formatNumber(state.printVal)
if (progress < (state.localDuration as number)) {
state.rAF = requestAnimationFrame(count)
} else {
emit("callback")
}
}
function formatNumber(num: number | string) {
const { decimals, decimal, separator, suffix, prefix } = props
num = Number(num).toFixed(decimals)
num += ""
const x = num.split(".")
let x1 = x[0]
const x2 = x.length > 1 ? decimal + x[1] : ""
const rgx = /(\d+)(\d{3})/
if (separator && !isNumber(separator)) {
while (rgx.test(x1)) {
x1 = x1.replace(rgx, "$1" + separator + "$2")
}
}
return prefix + x1 + x2 + suffix
}
onMounted(() => {
if (props.autoplay) {
start()
}
emit("mounted")
})
return () => (
<>
<span style={{
color: props.color, fontSize: props.fontSize
}}>{state.displayValue}</span>
</>
)
}
})

View File

@@ -1,5 +1,6 @@
/**
<template>
<span :style="{color: color}">{{ displayValue }}</span>
<span :style="{color: color,fontSize: fontSize}">{{ displayValue }}</span>
</template>
<script lang="ts">
import {
@@ -29,6 +30,7 @@ export default defineComponent({
rAF: any;
remaining: number | null;
color: any;
fontSize: string;
}>({
localStartVal: props.startVal,
displayValue: formatNumber(props.startVal),
@@ -39,7 +41,8 @@ export default defineComponent({
timestamp: null,
remaining: null,
rAF: null,
color: null
color: null,
fontSize: "16px"
});
onMounted(() => {
@@ -60,12 +63,13 @@ export default defineComponent({
});
function start() {
const { startVal, duration, color } = props;
const { startVal, duration, color, fontSize } = props;
state.localStartVal = startVal;
state.startTime = null;
state.localDuration = duration;
state.paused = false;
state.color = color;
state.fontSize = fontSize;
state.rAF = requestAnimationFrame(count);
}
@@ -173,3 +177,4 @@ export default defineComponent({
}
});
</script>
*/

View File

@@ -1,4 +1,3 @@
import { strict } from 'assert'
import { PropType } from 'vue'
import { propTypes } from '/@/utils/propTypes'
export const countToProps = {
@@ -18,6 +17,10 @@ export const countToProps = {
type: String as PropType<string>,
require: false
},
fontSize: {
type: String as PropType<string>,
require: false
},
decimal: propTypes.string.def('.'),
separator: propTypes.string.def(','),
prefix: propTypes.string.def(''),

View File

@@ -282,22 +282,22 @@ export default defineComponent({
<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>
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>
@@ -305,5 +305,5 @@ export default defineComponent({
</table>
</>
)
},
}
})