[vue3] 自定义组件的v-model

父组件

ts 复制代码
<script setup>
    const txt = ref('');
 </script>
 
 <template>
  <CustomInput v-model="txt" />
 </template>

子组件

defineProps defineEmits

<CustomInput> 组件内部需要做两件事:

将内部原生 <input> 元素的 value attribute 绑定到 modelValue prop

当原生的 input 事件触发时,触发一个携带了新值的 update:modelValue 自定义事件

ts 复制代码
<script setup>
const props = defineProps({
  'modelValue': String,
})
const emit = defineEmits(["update:modelValue"])
</script>

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

另一种在组件内实现 v-model 的方式是使用一个可写的,同时具有 getter 和 setter 的 computed 属性

computed 绑定

使用computed 属性时, get 方法需返回 modelValue prop,而 set 方法需触发相应的事件

子组件

ts 复制代码
<script setup>
const value = computed({
  get() {
    return props.modelValue
  },
  set(value) {
    emit("update:modelValue", value)
  }
})
</script>

<template>
 <input v-model="value" />
</template>

v-model 绑定多个属性

父组件

ts 复制代码
<template>
    <CustomInput v-model:first-name="first" v-model:last-name="last" />
</template>

子组件

ts 复制代码
 <script setup>
 const props = defineProps({
  firstName: String,
  lastName: String,
})
// 在computed中 使用
const emit = 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>

参考:

搞懂 vue3 中 v-model 的用法

相关推荐
猫猫不是喵喵.7 小时前
Vue3 Props 属性
前端·javascript·vue.js
小罗水14 小时前
第17章 后台管理端与演示支持
javascript·vue.js·ecmascript
濮水大叔14 小时前
不必把 Vue3 写成“麻花”:从状态碎片到对象协作,重新理解 Zova 的前端心智模型
前端·typescript·vue3·ioc·tsx·zova
猫猫不是喵喵.16 小时前
Vue3 中 computed 计算属性与 watch、watchEffect 监听
前端·javascript·vue.js
En^_^Joy17 小时前
Vue项目创建与入口配置全攻略
前端·vue.js·arcgis
猫猫不是喵喵.17 小时前
Vue2 的 Vuex 状态管理与 Vue3 的 Pinia 状态管理
前端·javascript·vue.js
退休倒计时18 小时前
【每日一题】LeetCode 45. 跳跃游戏 II TypeScript
算法·leetcode·typescript
TunerT_TQ20 小时前
GitHub深度工程评测:Cline 源码级工程评测|65k Star 开源AI编程助手的工程全景
typescript·开源·github·vs code·ai编程助手·开源供应链安全·静态源码审计
林焱_RPAAI1 天前
影刀RPA技术深度:CSS选择器高级实战指南——伪类属性选择器与性能对比完全解析
vue.js·react.js
陳陈陳2 天前
🚀 前端流式输出革命:SSE + BFF 架构从零到一实战指南
vue.js·架构·node.js