vue实现绑定输入参数
绑定输入参数的基本方法
在Vue中,可以通过v-model指令实现双向数据绑定,常用于表单输入元素。v-model会自动将输入的值与组件的data属性同步。
<template>
<input v-model="message" placeholder="输入内容">
<p>输入的内容是: {{ message }}</p>
</template>
<script>
export default {
data() {
return {
message: ''
}
}
}
</script>
自定义组件中的双向绑定
对于自定义组件,可以通过v-model结合props和$emit实现双向绑定。默认情况下,v-model在组件上使用value作为prop,input作为事件。

<template>
<custom-input v-model="message"></custom-input>
</template>
<script>
export default {
data() {
return {
message: ''
}
},
components: {
'custom-input': {
props: ['value'],
template: `
<input
:value="value"
@input="$emit('input', $event.target.value)"
>
`
}
}
}
</script>
使用.sync修饰符
Vue提供了.sync修饰符,可以更方便地实现父子组件之间的双向绑定。父组件通过.sync传递prop,子组件通过$emit('update:propName')更新。
<template>
<custom-input :message.sync="message"></custom-input>
</template>
<script>
export default {
data() {
return {
message: ''
}
},
components: {
'custom-input': {
props: ['message'],
template: `
<input
:value="message"
@input="$emit('update:message', $event.target.value)"
>
`
}
}
}
</script>
多个v-model绑定
Vue 2.x默认只支持单个v-model绑定,Vue 3.x支持多个v-model绑定。在Vue 2.x中可以通过自定义prop和事件实现类似功能。

<template>
<custom-input
v-model="message"
v-model:second="secondMessage"
></custom-input>
</template>
<script>
export default {
data() {
return {
message: '',
secondMessage: ''
}
},
components: {
'custom-input': {
props: ['value', 'second'],
template: `
<div>
<input
:value="value"
@input="$emit('input', $event.target.value)"
>
<input
:value="second"
@input="$emit('update:second', $event.target.value)"
>
</div>
`
}
}
}
</script>
表单修饰符
Vue为v-model提供了一些有用的修饰符,可以简化表单处理:
.lazy- 将input事件改为change事件触发.number- 自动将输入转为数字类型.trim- 自动去除输入的首尾空格
<input v-model.lazy="message">
<input v-model.number="age" type="number">
<input v-model.trim="text">
计算属性与绑定
对于需要复杂处理的输入值,可以结合计算属性使用。计算属性可以定义getter和setter,实现更灵活的数据绑定。
<template>
<input v-model="fullName">
</template>
<script>
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe'
}
},
computed: {
fullName: {
get() {
return `${this.firstName} ${this.lastName}`
},
set(value) {
const names = value.split(' ')
this.firstName = names[0]
this.lastName = names[1] || ''
}
}
}
}
</script>






