useVModel
简化 v-model
绑定的简写方式,将 props
+ emit
转换为 ref
我们鼓励你使用 Vue 的
defineModel
而不是这个组合式,然而有一些边缘情况,比如使用TSX
或deep: true
选项,defineModel
不支持。
用法
js
import { useVModel } from '@vueuse/core'
export default {
setup(props, { emit }) {
const data = useVModel(props, 'data', emit)
console.log(data.value) // props.data
data.value = 'foo' // emit('update:data', 'foo')
},
}
<script setup>
vue
<script lang="ts" setup>
import { useVModel } from '@vueuse/core'
const props = defineProps<{
modelValue: string
}>()
const emit = defineEmits(['update:modelValue'])
const data = useVModel(props, 'modelValue', emit)
</script>
类型声明
显示类型声明
typescript
export interface UseVModelOptions<T, Passive extends boolean = false> {
/**
* 当 passive 设置为 `true` 时,它将使用 `watch` 来与 props 和 ref 同步。
* 而不是依赖于 `v-model` 或 `.sync`。
*
* @default false
*/
passive?: Passive
/**
* 当设置了 eventName 时,它的值将用于覆盖 emit 事件的名称。
*
* @default undefined
*/
eventName?: string
/**
* 尝试检查嵌套对象或数组中属性的更改。
* 仅在将 `passive` 选项设置为 `true` 时应用
*
* @default false
*/
deep?: boolean
/**
* 在未传递值时定义返回 ref 的默认值。
*
* @default undefined
*/
defaultValue?: T
/**
* 克隆 props。
* 接受一个自定义克隆函数。
* 当设置为 `true` 时,它将使用 `JSON.parse(JSON.stringify(value))` 进行克隆。
*
* @default false
*/
clone?: boolean | CloneFn<T>
/**
* 在触发 emit 事件之前的钩子,可用于表单验证。
* 如果返回 false,则不会触发 emit 事件。
*
* @default undefined
*/
shouldEmit?: (v: T) => boolean
}
export declare function useVModel<
P extends object,
K extends keyof P,
Name extends string,
>(
props: P,
key?: K,
emit?: (name: Name, ...args: any[]) => void,
options?: UseVModelOptions<P[K], false>,
): WritableComputedRef<P[K]>
export declare function useVModel<
P extends object,
K extends keyof P,
Name extends string,
>(
props: P,
key?: K,
emit?: (name: Name, ...args: any[]) => void,
options?: UseVModelOptions<P[K], true>,
): Ref<UnwrapRef<P[K]>>
源码
贡献者
更新日志
v12.0.0-beta.1
on 11/21/2024v10.4.0
on 8/25/2023v10.2.0
on 6/16/2023v10.0.0-beta.5
on 4/13/2023cb644
- refactor!: remove isFunction
and isString
utilsv10.0.0-beta.1
on 3/23/2023