vue中的v-model
指令实现了表单的双向绑定,官网例子:
| <input type="text" v-model="message" /> |
| <p>{{message}}</p> |
其实v-model
只是语法糖,真正的实现形式:
| <input type="text" :value="message" @input="message = $event.target.value" /> |
- 将输入框的值绑定到
message
变量上,这只是单向的,改变message
的值可以改变input
的value
,但是改变input
的输入不会改变message
。
- 监听input事件,当输入内容时,改变
message
变量,从而实现了双向绑定。
从官网上看到,v-model
在内部为不同的输入元素使用不同的属性并抛出不同的事件:
text
和textarea
元素使用value
属性和input
事件
checkbox
和radio
使用checked
属性和change
事件
select
使用value
和change
事件
实现自定义输入框组件v-model,即双向绑定
| Vue.component('custom-input', { |
| |
| template: `<input :value="value" @input="updateVal($event.target.value)" type="text"></input>`, |
| |
| props: ["value"], |
| methods: { |
| |
| updateVal(val) { |
| this.$emit("input", val); |
| } |
| } |
| }); |
| <template> |
| <div id="app"> |
| // 父组件的value值绑定price |
| <price-input :value="price" @input="onInput"></price-input> |
| </div> |
| </template> |
| <script> |
| var app = new Vue({ |
| el: '#app', |
| data() { |
| price: '' |
| }, |
| methods: { |
| |
| onInput(val) { |
| this.price = val; |
| } |
| } |
| }) |
| </script> |
- 通过上面的分析,默认情况下,一个组件上的
v-model
会把value
用作prop
且把input
用作event
。
- 所以当我们在一个自定义组件上使用
v-model
并不能实现双向绑定,因为自定义组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显示的去声明定义这些东西。
- 这时,
model
选项就派上用场了,在定义组件的时候,指定prop
的值和监听的事件。
| <template> |
| <input type="text" :value="uname" @input="updateVal($event.target.value)" /> |
| </template> |
| <script> |
| Vue.component('my-input', { |
| model: { |
| prop: 'uname', |
| event: 'changeXXX' |
| }, |
| props: { |
| uname: { |
| type: String, |
| default: 'tom' |
| } |
| }, |
| methods: { |
| updateVal(val) { |
| this.$emit('changeXXX', val); |
| } |
| } |
| }) |
| </script> |
然后,父组件使用v-model
就可以了
| <template> |
| <my-input v-model="name" value="some value"></my-input> |
| <p>{{name}}</p> |
| </template> |
等价于
| <my-input :uname="name" @changeXXX="val => {foo = val}" value="some value"></my-input> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类