Vue基础-自定义事件的表单输入组件、自定义组件的 v-model
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会使用valueprop 和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的更多相关文章
- 前端MVC Vue2学习总结(五)——表单输入绑定、组件
一.表单输入绑定 1.1.基础用法 你可以用 v-model 指令在表单控件元素上创建双向数据绑定.它会根据控件类型自动选取正确的方法来更新元素.尽管有些神奇,但 v-model 本质上不过是语法糖, ...
- Vue学习计划基础笔记(五) - 表单输入绑定、组件基础
表单输入绑定.组件基础 目标: 熟练掌握vue中表单的处理方式 对之前学习的内容简单回顾一下,并写一个实例,学以致用(最好脱离文档) vue中表单的处理方式 vue中表单的处理使用了v-model指令 ...
- Vue.js学习笔记--3.表单输入绑定
整理自官网教程 -- https://cn.vuejs.org/ 利用v-model可以实现表单元素的value与后台数据的双向绑定,具体用法如下: <!--文本--> <input ...
- Vue知识整理13:表单输入绑定(v-model)
text:将输入框等表单,通过data变量实现数据绑定. textbox:数据绑定 3.checkbox和redio组件: 注意:data数据变量中,checkbox有可能会有多个结果,所以用数组: ...
- Blazor和Vue对比学习(基础1.9):表单输入绑定和验证,VeeValidate和EditFrom
这是基础部分的最后一章,内容比较简单,算是为基础部分来个HappyEnding.我们分三个部分来学习: 表单输入绑定 Vue的表单验证:VeeValidate Blazor的表单验证:EditForm ...
- Vue.js教程--基础2(事件处理 表单输入绑定
事件处理 表单输入绑定 事件处理 监听v-on 监听 DOM 事件,并在触发时运行一些 JavaScript 代码. 可以在v-on:click=''加内联语句. 有时也需要在内联语句处理器中访问原始 ...
- vue样式绑定、事件监听、表单输入绑定、响应接口
1.样式绑定 操作元素的 class 列表和内联样式是数据绑定的一个常见需求.因为它们都是属性,所以我们可以用 v-bind 处理它们:只需要通过表达式计算出字符串结果即可.不过,字符串拼接麻烦且易错 ...
- jQuery基础(鼠标事件,表单事件,键盘事件,自定义事件 篇)
1.jQuery鼠标事件之click与dbclick事件 方法一:$ele.click()(不带参数) <div id="test">点击触发<div&g ...
- vue 表单输入与绑定 v-model
vue使用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定.下面我们通过示例先了解下基本用法: &l ...
随机推荐
- java开发常用到的jar包总结
commons-io.jar: FileUtils 读取文件所有行 File file = new File("c:\\123.txt"); List<String> ...
- 479. Second Max of Array【easy】
Find the second max number in a given array. Notice You can assume the array contains at least two n ...
- MDI多文档窗体--在一个窗体中装载多个窗体
创建MDI窗体之前,首先要明确两个概念:父窗体和子窗体,在MDI窗体中,起到容器作用的窗体被称为“父窗体”, 可放在父窗体中的其他窗体被称为子窗体,也成为MDI子窗体.当应用程序启动时,首先会显示父窗 ...
- 关于报错“syntax error near unexpected token `”和回车换行
本来是很简单一个事情,转过来是因为打字机这事比较有趣…… http://blog.csdn.net/xyp84/archive/2009/08/11/4435899.aspx 摘要一下: 回车 换行 ...
- 利用WordPress用户密码算法规则修改用户密码
WordPress用户密码保存在wp_users数据表的user_pass字段,密码是通过Portable PHP password hashing framework类产生的, 密码的形式是随机且不 ...
- ubuntu下更改分辨率
在虚拟机中装了ubuntu但是没有1600*900的分辨率 第一步: xrandr -q 查看现在系统中所有的分辨率 第二步: cvt 1600 900 得到所需的更改分辨率数据 第三步: ww ...
- 关于Cocos2d-x中两个场景之间参数的传递
两个场景之间,有的时候要进行参数传递,如果想通过实例化出一个场景,从而得到属性和方法是不对的想法 你有两个场景,第一场景是用户登录界面,第二场景则是你登录后的界面,你如何将用户登录的值传到第二个场景呢 ...
- 下列JSP代码:
下列JSP代码: <html> <body> <% for(int i = 0; i < 10; i++) { //1 } %> </body> ...
- 【BZOJ】2179: FFT快速傅立叶(fft)
http://www.lydsy.com/JudgeOnline/problem.php?id=2179 fft裸题.... 为嘛我的那么慢....1000多ms.. #include <cst ...
- 小结:trie
复杂度: 查找O(n),维护O(n),空间O(sum(len[i])) 概要: 就是每个节点对应一个字母,然后儿子有26个,查找和维护时进入对应儿子即可. 应用:在字符串匹配中多模匹配做基础结构:可以 ...