Vue基操之v-model
v-model用在input元素上时
v-model虽然很像使用了双向绑定的Angular的ng-model,但是Vue是单向数据流,v-model只是语法糖而已。
1 | <input v-model="sth" /> |
首先你要知道input元素本省有个oninput事件,这是HTML5新增加的,类似onchange,每当输入框内容发生变化,就会触发oninput,把最新的value传递给sth。
如果你不知道$event是从哪来的,文档中有。
在给元素添加 v-model 属性时,默认会把value作为元素的属性,然后把’input’事件作为实时传递value的触发事件
v-model用在组件上时
v-model不仅仅能在input上用,在组件上也能使用,下面是一个例子
1 | <div id="demo"> |
如果你知道这两个问题的答案,那么恭喜你真正掌握了 v-model,如果你没明白,那么可以看下这段代码:↓
1 | <currency-input v-model="price"></currentcy-input> |
现在你知道 value 和 input 从哪来的了吧。与上面总结的类似:
给组件添加 v-model 属性时,默认会把 value 作为组件的属性,然后把 ‘input’ 值作为给组件绑定事件时的事件名
v-model的缺点和解决办法
在创建类似复选框或者单选框的常用组件时,v-model就不好用了。
1 | <input type="checkbox" v-model="sth" /> |
v-model 给我们提供好了 value 属性和 oninput 事件,但是,我们需要的不是 value 属性,而是 checked 属性,并且当你点击这个单选框的时候不会触发 oninput 事件,它只会触发 onchange 事件。这就尴尬了😓
因为 v-model 只是用到了 input 元素上,所以这种情况好解决:↓
1 | <input type="checkbox" :checked="status" @change="status = $event.target.checked" /> |
当 v-model 用到组件上时:↓
1 | <my-checkbox v-model="foo"></my-checkbox> |
在 Vue 2.2 版本,你可以在定义组件时通过 mode l选项的方式来定制 prop/event:↓
1 | <my-checkbox v-model="foo"></my-checkbox> |
通过以上讲解,我们总结一下如何利用v-model实现自定义的表单组件:
监听原生组件的事件,当获取到原生组件的值后把 值通过调用 $emit(‘input’ ,data) 方法去触发 input事件