组件v-model和自定义v-model修饰符(vModelText)

<script setup>
defineProps(['modelValue'])
defineEmits(['update:modelValue'])

</script>

<template>
    <input  :value="modelValue" @input="$emit('update:modelValue',$event.target.value)"  />
</template>

<CustomInput  v-model="searchText">

默认情况下,v-mode都是使用modelValue作为prop,并以update:modelValue作为对应的事件。可以通过给v-model指定一个参数来更改这些名字。

<MyComponent v-model:title="bookTitle" />


<!-- MyComponent.vue -->
<script setup>
defineProps(['title'])
defineEmits(['update:title'])
</script>

<template>
  <input
    type="text"
    :value="title"
    @input="$emit('update:title', $event.target.value)"
  />
</template>


也可以绑定多个v-model值 

<MyCom v-model:first-name="first"></Mycom>
<MyCom v-model:last-name="last"></Mycom>

<!-- MyCom  -->
<script setup>
defineProps({
    firstName:String,
    lastName:String
})

defineEmits(['update:firstName', 'update:lastName'])
</script>

<template>
  <input
    type="text"
    :value="firstName"
    @input="$emit('update:firstName', $event.target.value)"
  />
  <input
    type="text"
    :value="lastName"
    @input="$emit('update:lastName', $event.target.value)"
  />
</template>

处理v-model修饰符

<MyCom v-model.capitalize="mytext"></MyCom>


<script>
const props = defineProps({
    modelValue:String,
    modelModifiers:{default: ()=> ({}) }

})

defineEmits(['update:modelValue'])


function emitValue(e) {
  let value = e.target.value
  if (props.modelModifiers.capitalize) {
    value = value.charAt(0).toUpperCase() + value.slice(1)
  }
  emit('update:modelValue', value)
}
</script>

<template>
  <input type="text" :value="modelValue" @input="emitValue" />
</template>

如果不使用组件,直接给一个原生元素绑定自定义修饰符的v-model,可以用vModelText

<script setup>

 // 导入 ref 和 vModelText 函数

 import { ref, vModelText } from 'vue';

 // 定义一个响应式变量 value

 const value = ref('');

 // 使用 vModelText.beforeUpdate 指令,在更新 value 之前对输入值进行操作

 vModelText.beforeUpdate = (el, binding) => {

   // 如果输入值不为空且包含 capitalize 修饰符,则将输入值的首字母转换为大写

   if (el.value && binding.modifiers.capitalize) {

     el.value = el.value.charAt(0).toUpperCase() + el.value.slice(1);

   }

 };

</script>


<template>

  <input type="text" v-model.capitalize="value" />

</template>

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值