You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3组件中如何通过Ref获取自定义输入组件的值?

解决自定义输入组件的取值与校验问题

方案1:用v-model双向绑定(推荐)

这是Vue组件通信的标准做法,不用依赖ref就能实时拿到输入值:

  • 自定义输入组件内部(Vue3):
<!-- CustomInput.vue -->
<template>
  <input 
    type="text" 
    :value="modelValue" 
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

<script setup>
// 接收父组件传递的绑定值
defineProps(['modelValue'])
// 定义更新值的事件
defineEmits(['update:modelValue'])
</script>
  • 父组件使用:
<template>
  <CustomInput v-model="username" @input="handleCheck" />
</template>

<script setup>
import { ref } from 'vue'
const username = ref('')

const handleCheck = () => {
  // 直接用username.value做正则校验
  const reg = /^[a-zA-Z0-9]{6,16}$/
  console.log('输入是否合法:', reg.test(username.value))
}
</script>

父组件的username会和输入框值实时同步,直接拿来校验即可,完全不需要ref。

方案2:通过ref暴露内部原生input

如果一定要保留ref的用法,可以把组件内部的原生input实例暴露给父组件:

  • 自定义输入组件内部:
<!-- CustomInput.vue -->
<template>
  <input ref="inputRef" type="text" />
</template>

<script setup>
import { ref } from 'vue'
const inputRef = ref(null)
// 把内部的inputRef暴露给父组件
defineExpose({ inputRef })
</script>
  • 父组件使用:
<template>
  <CustomInput ref="customInputRef" @input="handleCheck" />
</template>

<script setup>
import { ref } from 'vue'
const customInputRef = ref(null)

const handleCheck = () => {
  // 逐层获取内部input的值
  const inputValue = customInputRef.value.inputRef.value.value
  const reg = /^[a-zA-Z0-9]{6,16}$/
  console.log('输入是否合法:', reg.test(inputValue))
}
</script>

方案3:组件内部封装校验逻辑

如果校验是该输入组件的通用逻辑,直接在组件内部处理,把结果传给父组件更省心:

  • 自定义输入组件内部:
<!-- CustomInput.vue -->
<template>
  <input 
    type="text" 
    :value="modelValue" 
    @input="handleInput"
  />
</template>

<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue', 'checkResult'])

const handleInput = (e) => {
  const value = e.target.value
  emit('update:modelValue', value)
  // 内部执行正则校验,把结果传给父组件
  const reg = /^[a-zA-Z0-9]{6,16}$/
  emit('checkResult', reg.test(value))
}
</script>
  • 父组件使用:
<template>
  <CustomInput v-model="username" @checkResult="handleCheckResult" />
</template>

<script setup>
import { ref } from 'vue'
const username = ref('')

const handleCheckResult = (isValid) => {
  console.log('输入是否合法:', isValid)
}
</script>

内容的提问来源于stack exchange,提问作者Soon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:01:07