r-util-js/packages/vue3/src/hooks/utils/index.ts

116 lines
2.5 KiB
TypeScript
Raw Normal View History

2026-04-20 17:54:26 +08:00
import { getValueOfRule } from "@r-utils/common";
import { ref, computed, toRef } from "vue";
import type { InputOptions, InputValue } from "@r-utils/common";
import type { Ref } from "vue";
/**
*
* @param initTime
*/
export function useTimer(initTime = 0) {
const time = ref(initTime);
2026-05-28 11:30:35 +08:00
const timeInterval = ref<ReturnType<typeof setInterval>>();
2026-04-20 17:54:26 +08:00
const start = () => {
timeInterval.value = setInterval(() => {
if (time.value <= 0) {
clearInterval(timeInterval.value);
return;
}
time.value--;
}, 1000);
};
const restart = () => {
time.value = initTime;
start();
};
const stop = () => {
time.value = 0;
clearInterval(timeInterval.value);
};
return { time, start, restart, timeInterval, stop };
}
type UseNumberSetFn = (v: string | number) => string | number;
const defaultUseNumberSetFn: UseNumberSetFn = (v: string | number) => String(v);
/**
*
* @param value
* @param setFn
*/
export function useNumber(
value: Ref<string | number>,
setFn: UseNumberSetFn = defaultUseNumberSetFn,
) {
const int = computed<number>({
// 总是返回整数
get: () => Number.parseInt(String(value.value)),
set: (v) => {
value.value = setFn(v);
},
});
const float = computed<number>({
// 总是返回 float
get: () => Number.parseFloat(String(value.value)),
set: (v) => {
value.value = setFn(v);
},
});
const number = computed<number>({
// 总是返回 Number
get: () => Number(value.value),
set: (v) => {
value.value = setFn(v);
},
});
return { number, int, float };
}
/**
*
* @param value
*/
export function useString(value: Ref<string | number>) {
const string = computed<string>({
get: () => String(value.value),
set: (v) => {
value.value = v;
},
});
return { string };
}
interface UseValueOfRuleOptions {
value: InputValue | Ref<InputValue>;
rule: InputOptions;
}
/**
*
* @param options
*/
export function useValueOfRule(options: UseValueOfRuleOptions) {
const value = toRef(options.value);
const rule = toRef(options.rule);
function handleChange() {
const newValue = getValueOfRule(value.value, rule.value);
value.value = newValue;
}
return {
value,
rule,
handleChange,
};
}