Vue 测试版本:Vue.js v2.5.13

学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下:

如果不用 v-model,代码应该是这样:

<myinput
v-on:par-input="price=arguments[0]"
v-bind:par-value="price"
> </myinput>
<p>{{price}}</p>
window.onload = function() {

    Vue.component('myinput', {
template: `
<input type="text" v-on:input="updateV($event.target.value)" v-bind:value="parValue"
></input>
`,
props: ['par-value'],
methods: {
updateV(v) {
this.$emit('par-input', v);
}
}
}); new Vue({
el: '#app',
data: {
price: ''
}
});
};

注意父子组件是通过 par-value 实现绑定的,监听的是父组件的 par-input 事件,注意父子组件之间的绑定和数据传递,简单来说:

数据绑定:

  • input 元素的 value 属性与父组件 myinput 的 parValue 绑定 =>
  • 父组件 myinput 的 parValue 与 Vue 实例的 price 绑定 =>
  • input 元素的 value 属性与 Vue 实例的 price 间接绑定

事件传递:

  • input 元素的 input 事件触发 updateV 回调 =>
  • updateV 回调里手动触发父组件 myinput 的自定义事件 par-input ,并传递 input 元素的值 $event.target.value=>
  • 父组件 myinput 的自定义事件 par-input 把 Vue 实例的 price 属性改为 $event.target.value,实现数据更新;

这个逻辑可以用 v-model 语法糖来简化:

<myinput v-model="price"></myinput>
<p>{{price}}</p>
window.onload = function() {

    Vue.component('myinput', {
template: `
<input type="text" v-on:input="updateV($event.target.value)" v-bind:value="value"
></input>
`,
props: ['value'],
methods: {
updateV(v) {
this.$emit('input', v);
}
}
}); new Vue({
el: '#app',
data: {
price: ''
}
});
};

v-model 简化了代码,所以其中的传递方式都采用了默认的 input 事件 和 value 属性,前后对比下,就可以发现:

  • 父组件 myinput 的自定义事件与子组件 input 的事件名一致,都是通过 input 来触发,且数据都是通过 value 属性绑定和传递;

但是:

默认情况下,一个组件的 v-model 会使用 value prop 和 input 事件。但是诸如单选框、复选框之类的输入类型可能把 value 用作了别的目的。model 选项可以避免这样的冲突:

这个时候,如果还要用 model ,肯定要做些修改,譬如下面:

<mycheckbox v-model="isChecked"></mycheckbox>
<p>{{isChecked}}</p>
window.onload = function() {

    Vue.component('mycheckbox', {
template: `
<input type="checkbox" v-on:change="updateV($event.target.checked)" v-bind:checked="checked"
></input>
`,
props: ['checked'],
model: {//新增
prop: 'checked',
event: 'change'
},
methods: {
updateV(v) {
this.$emit('change', v);
}
}
}); new Vue({
el: '#app',
data: {
isChecked: false
}
});
};

除了 model 是新增的参数,其他的根据实际情况做些正常修改,应该都可以理解,这里的 model 结合最前面的绑定,应该也能理解。

参考资料:

https://cn.vuejs.org/v2/guide/components.html#使用自定义事件的表单输入组件

Vue基础-自定义事件的表单输入组件、自定义组件的 v-model的更多相关文章

  1. 前端MVC Vue2学习总结(五)——表单输入绑定、组件

    一.表单输入绑定 1.1.基础用法 你可以用 v-model 指令在表单控件元素上创建双向数据绑定.它会根据控件类型自动选取正确的方法来更新元素.尽管有些神奇,但 v-model 本质上不过是语法糖, ...

  2. Vue学习计划基础笔记(五) - 表单输入绑定、组件基础

    表单输入绑定.组件基础 目标: 熟练掌握vue中表单的处理方式 对之前学习的内容简单回顾一下,并写一个实例,学以致用(最好脱离文档) vue中表单的处理方式 vue中表单的处理使用了v-model指令 ...

  3. Vue.js学习笔记--3.表单输入绑定

    整理自官网教程 -- https://cn.vuejs.org/ 利用v-model可以实现表单元素的value与后台数据的双向绑定,具体用法如下: <!--文本--> <input ...

  4. Vue知识整理13:表单输入绑定(v-model)

    text:将输入框等表单,通过data变量实现数据绑定. textbox:数据绑定 3.checkbox和redio组件: 注意:data数据变量中,checkbox有可能会有多个结果,所以用数组: ...

  5. Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom

    这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...

  6. Vue.js教程--基础2(事件处理 表单输入绑定

    事件处理 表单输入绑定 事件处理 监听v-on 监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 可以在v-on:click=''加内联语句. 有时也需要在内联语句处理器中访问原始 ...

  7. vue样式绑定、事件监听、表单输入绑定、响应接口

    1.样式绑定 操作元素的 class 列表和内联样式是数据绑定的一个常见需求.因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼接麻烦且易错 ...

  8. jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)

    1.jQuery鼠标事件之click与dbclick事件   方法一:$ele.click()(不带参数)   <div id="test">点击触发<div&g ...

  9. vue 表单输入与绑定 v-model

    vue使用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定.下面我们通过示例先了解下基本用法: &l ...

随机推荐

  1. 点滴积累【JS】---JS实现仿百度模糊搜索效果

    效果: HTML代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="In ...

  2. HttpClient设置编码类型

    笔者引用的是commons-httpclient这个jar包httpclient 可是通过get/post方式获取带有中文页面的html文件时.返回的是乱码,在网上找了非常久.最终找到一个合适的: H ...

  3. struts2拦截器的实现原理及源码剖析

    拦截器(interceptor)是Struts2最强大的特性之一,也可以说是struts2的核心,拦截器可以让你在Action和result被执行之前或之后进行一些处理.同时,拦截器也可以让你将通用的 ...

  4. 01、Windows Store APP 设置页面横竖屏的方法

    在 windows phone store app 中,判断和设置页面横竖屏的方法,与 silverlight 中的 Page 类 不同,不能直接通过 Page.Orientation 进行设置.而是 ...

  5. [转]ISTQB FL初级认证考试资料(中文)

    [转]ISTQB FL初级认证考试资料(中文) 2015-06-22 ISTQB作为一个专业的提供软件测试认证的机构,得到了全球软件测试人员的认可.目前中国有越来越多的人已经获得或者希望获得ISTQB ...

  6. word文档老是出现这个提示-----“发现二义性的名称:TmpDDE”错误

    你好 我解决这个问题了,我把appdata目录下的normal.dotm删除了就没问题了 将系统中路径C:\Users\Administrator\AppData\Roaming\Microsoft\ ...

  7. 等边三角形---dfs

    蒜头君手上有一些小木棍,它们长短不一,蒜头君想用这些木棍拼出一个等边三角形,并且每根木棍都要用到. 例如,蒜头君手上有长度为 11,22,33,33 的4根木棍,他可以让长度为11,22 的木棍组成一 ...

  8. RFID Hacking–资源大合集

    原文: http://www.freebuf.com/news/others/605.html http://www.proxmark.org/forum/index.php RFID破解神器官方论坛 ...

  9. Photoshop学习笔记(1)--界面设置

    根据慕课网教学视频整理(抄了一个妹子的评论): http://www.imooc.com/video/9813 ps版本:CS6 步骤: 1.视图->显示->智能参考线,以及视图-> ...

  10. 网桥bridge

    1. 网桥基础 什么是网桥 网桥将多个网络在数据链路层连接起来.网桥的前身是集线器或中继器.网桥和集线器的区别:集线器上各端口都是共享同一条背板总线的,网桥的两个端口分别有一条独立的交换信道,不是共享 ...