Vue.js自定义事件的表单输入组件方法


Posted in Javascript onMarch 08, 2018

Vue.js使用自定义事件的表单输入组件

自定义事件可以用来创建自定义的表单输入组件,使用 v-model 来进行数据双向绑定。要牢记:

<input v-model="something">

这不过是以下示例的语法糖:

<input
 v-bind:value="something"
 v-on:input="something = $event.target.value">

所以在组件中使用时,它相当于下面的简写:

<custom-input
 v-bind:value="something"
 v-on:input="something = arguments[0]">
</custom-input>

所以要让组件的 v-model 生效,它应该 (从 2.2.0 起是可配置的):

接受一个 value prop

在有新的值时触发 input 事件并将新值作为参数

我们来看一个非常简单的货币输入的自定义控件:--在父组件中引用子组件模板时用绑定v-model数据:

<currency-input v-model="price"></currency-input>
Vue.component('currency-input', {
 template: '\
  <span>\
   $\
   <input\
    ref="input"\
    v-bind:value="value"\
    v-on:input="updateValue($event.target.value)"\
   >\
  </span>\
 ',
 props: ['value'],
 methods: {
  // 不是直接更新值,而是使用此方法来对输入值进行格式化和位数限制
  updateValue: function (value) {
   var formattedValue = value
    // 删除两侧的空格符
    .trim()
    // 保留 2 位小数
    .slice(
     0,
     value.indexOf('.') === -1
      ? value.length
      : value.indexOf('.') + 3
    )
   // 如果值尚不合规,则手动覆盖为合规的值
   if (formattedValue !== value) {
    this.$refs.input.value = formattedValue
   }
   // 通过 input 事件带出数值
   this.$emit('input', Number(formattedValue))
  }
 }
})

自定义组件的 v-model

2.2.0 新增

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

Vue.component('my-checkbox', {
 model: {
  prop: 'checked',
  event: 'change'
 },
 props: {
  checked: Boolean,
  // 这样就允许拿 `value` 这个 prop 做其它事了
  value: String
 },
 // ...
})
<my-checkbox v-model="foo" value="some value"></my-checkbox>

上述代码等价于:

<my-checkbox
 :checked="foo"
 @change="val => { foo = val }"
 value="some value">
</my-checkbox>

注意你仍然需要显式声明 checked 这个 prop。

以上这篇Vue.js自定义事件的表单输入组件方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery获取所有选中的checkbox实现代码
May 26 Javascript
Vue中添加过渡效果的方法
Mar 16 Javascript
easyui-datagrid特殊字符不能显示的处理方法
Apr 12 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
ReactJs实现树形结构的数据显示的组件的示例
Aug 18 Javascript
JavaScript实现短暂提示框功能
Apr 04 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
Apr 17 Javascript
js实现贪吃蛇小游戏
Oct 29 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
Jan 04 Javascript
原生js实现文件上传、下载、封装等实例方法
Jan 05 Javascript
JavaScript中while循环的基础使用教程
Aug 11 Javascript
解决Vue项目中tff报错的问题
Oct 21 Javascript
layui之select的option叠加问题的解决方法
Mar 08 #Javascript
vue2.0 axios跨域并渲染的问题解决方法
Mar 08 #Javascript
解决Vue 通过下表修改数组,页面不渲染的问题
Mar 08 #Javascript
Vue.js实现图片的随意拖动方法
Mar 08 #Javascript
JS字符串去除连续或全部重复字符的实例
Mar 08 #Javascript
实战node静态文件服务器的示例代码
Mar 08 #Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 #Javascript
You might like
TNC vs BOOM BO3 第三场2.13
2021/03/10 DOTA
javascript oop开发滑动(slide)菜单控件
2010/08/25 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
初识Node.js
2015/03/20 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
jQuery的deferred对象使用详解
2016/09/25 Javascript
功能强大的jquery.validate表单验证插件
2016/11/07 Javascript
javascript基于原型链的继承及call和apply函数用法分析
2016/12/15 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
JS日程管理插件FullCalendar中文说明文档
2017/02/06 Javascript
View.post() 不靠谱的地方你知道多少
2017/08/29 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
JavaScript实现简单的文本逐字打印效果示例
2018/04/12 Javascript
如何在postman测试用例中实现断言过程解析
2020/07/09 Javascript
Vue自定义组件双向绑定实现原理及方法详解
2020/09/03 Javascript
python统计字符串中指定字符出现次数的方法
2015/04/04 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
python 简单的多线程链接实现代码
2016/08/28 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
Django发送邮件功能实例详解
2019/09/02 Python
python 装饰器的基本使用
2021/01/13 Python
使用CSS禁止textarea调整大小功能的方法
2015/03/13 HTML / CSS
路易威登和香奈儿手袋:LuxeDH
2017/01/12 全球购物
美体小铺奥地利官方网站:The Body Shop奥地利
2019/04/11 全球购物
高三英语教学反思
2014/01/13 职场文书
环境卫生倡议书
2014/08/29 职场文书
网站出售协议书范文
2014/10/10 职场文书
办公室主任岗位职责范本
2015/03/31 职场文书
教师外出学习心得体会
2016/01/18 职场文书
CSS3 制作精美的定价表
2021/04/06 HTML / CSS
Python字符串对齐方法使用(ljust()、rjust()和center())
2021/04/26 Python
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电