简易 useVModel,useVModels,具备ts类型检查

灯火 Lv3

前言

在uni-微信小程序下使用 useVModel (@vueuse/core)会报错,就自己重写了个useVModel,useVModels

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { computed } from "vue";
import type { WritableComputedRef } from "vue";
/**
* 单个属性双向绑定,存在多个属性需要双向绑定时,请使用useVModels
* @param props
* @param propName
* @param emit
* @returns
*/
export function useVModel<P extends object, K extends string & keyof P>(
props: P,
propName: K,
emit: (event: `update:${K}`, ...args: any[]) => void
) {
return computed({
get() {
if (
Object.prototype.toString.call(props[propName]) === "[object Object]"
) {
return new Proxy(props[propName] as object, {
set(obj, name, val) {
emit(`update:${propName}`, Object.assign(obj, { [name]: val }));
return true;
},
});
}
return props[propName];
},
set(val) {
emit(`update:${propName}`, val);
},
});
}

/**
* 多个属性双向绑定
* @param props
* @param emit
* @returns
*/
export function useVModels<P extends object, Name extends string>(
props: P,
emit?: (name: Name, ...args: any[]) => void
) {
const ret = {} as {
[K in keyof P]: WritableComputedRef<object | P[K]>
};

for (const key in props) ret[key] = useVModel(props, key, emit as any)
return ret;
}

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

// 当输入不规范时,比如:

// 单词错误
// 类型“"modelValue1"”的参数不能赋给类型“"modelValue"”的参数。ts(2345)
// const emit = defineEmits(['update:modelValue'])
// const props = defineProps<{ modelValue: any }>()
// const modelValue = useVModel(props, 'modelValue1', emit)

// props没有这个属性
// 类型“string”的参数不能赋给类型“never”的参数。ts(2345)
// const emit = defineEmits(['update:modelValue'])
// const props = defineProps<{ }>()
// const modelValue = useVModel(props, 'modelValue1', emit)

// emit没有update:modelValue
// 类型“(event: never, ...args: any[]) => void”的参数不能赋给类型“(event: "update:modelValue", ...args: any[]) => void”的参数。
// const emit = defineEmits(['update:modelValue'])
// const props = defineProps<{ }>()
// const modelValue = useVModel(props, 'modelValue1', emit)


// 正确使用 useVModel
// const emit = defineEmits(['update:modelValue'])
// const props = defineProps<{ modelValue: any }>()
// const modelValue = useVModel(props, 'modelValue', emit)

// 正确使用 useVModels
const props = defineProps<{ modelValue: any, cursorVisible: boolean }>()
const emit = defineEmits<{
(e: "update:modelValue", value: any): void;
(e: "update:cursorVisible", value: boolean): void;
}>();

const { modelValue, cursorVisible } = useVModels(props, emit)

  • 标题: 简易 useVModel,useVModels,具备ts类型检查
  • 作者: 灯火
  • 创建于 : 2024-03-22 08:04:18
  • 更新于 : 2024-03-22 08:21:50
  • 链接: https://blog.juniverse.top/2024/03/22/easy-useVModel/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
此页目录
简易 useVModel,useVModels,具备ts类型检查