Vue第一个自定义组件:数字输入框(number-input)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>数字输入框</title>
<script type="text/javascript" src="js/lib/vue.js"></script>
<script type="text/javascript" src="js/input-test-num.js"></script>
</head>
<body>
<div id="app">
{{value}}
<number-input v-model="value" :max="10" :min="-10" :step="2"></number-input>
</div>
</body>
<script type="text/javascript">
function isValueNumber(value){
return (/(^-?[0-9]+\.{1}\d+$)|(^-?[1-9][0-9]*$)|(^-?0{1}$)/).test(value);
} var app = new Vue({
el:'#app',
data:{
value:0
}
});
</script>
</html>
JS:input-test-num.js
Vue.component('number-input',{
// 定义来自父级的参数
props:{
max:{
type:Number,
default:Infinity
},
min:{
type:Number,
default:-Infinity
},
value:{
type:Number,
default:0
},
step:{
type:Number,
default:1
}
},
template:'\
<div>\
<input type="text" :value="currentValue" @change="handleChange" @keydown="handleKeydown" />\
<button @click="handleAdd" :disabled="currentValue>=max"> ADD </button>\
<button @click="handleReduce" :disabled="currentValue<=min"> Reduce </button>\
</div>',
data:function(){
// Vue组件是单向数据流,无法直接修改prop中的值
var currentValue = 0 ;
if(this.value > this.max){
currentValue = this.max ;
} else if(this.value < this.min){
currentValue = this.min ;
} else{
currentValue = this.value ;
}
return {
currentValue :currentValue
}
},
methods:{
handleChange:function(event){
var val = event.target.value.trim() ;
if(isValueNumber(val)){
var max = this.max ;
var min = this.min ;
val = Number(val);
this.currentValue = val ;
if(val>max) this.currentValue = max ;
if(val<min) this.currentValue = min ;
}else{
// 如果输入的非数字,则保留之前的数据
event.target.value = this.currentValue ;
}
},
// 绑定键盘事件
handleKeydown:function(event){
if(event.keyCode==38){
this.handleAdd();
}
if(event.keyCode==40){
this.handleReduce() ;
}
},
handleAdd:function(){
if(this.currentValue>=this.max) return ;
this.currentValue += this.step ;
},handleReduce:function(){
if(this.currentValue<=this.min) return ;
this.currentValue -= this.step;
},
updateVal:function(val){
if(val>this.max) val = this.max ;
if(val<this.min) val = this.min ;
this.currentValue = val ;
}
},
watch:{
// 增加监听
currentValue:function(val){
this.$emit('input',val);
this.$emit('on-change',val);
},
value:function(val){
this.updateVal(val);
}
}
})
!可根据自己情况增加样式
Vue第一个自定义组件:数字输入框(number-input)的更多相关文章
- 《vue.js实战》练习---数字输入框组件
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- vue.js2.0 自定义组件初体验
理解 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况 ...
- Vue.extend提供自定义组件的构造器
Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元 ...
- vue框架之自定义组件中使用v-model
通常 vue在html常见表单空间支持v-model双向绑定例如 <input v-model="message" placeholder="edit me&quo ...
- vue怎么给自定义组件绑定原生事件
下面主要以4个示例Demo演示(示例代码JS引用的Vue CDN),建议小伙伴直接复制示例代码运行查看, 赶时间的小伙伴可直接往下拉,看示例demo4 注:全局或局部注册的组件称为子组件,其中声明的 ...
- vue之全局自定义组件
在项目开发中,往往需要使用到一些公共组件,比如,弹出消息.面包屑或者其它的组件,为了使用方便,将其以插件的形式融入到vue中,以面包屑插件为例: 1.创建公共组件MyBread.vue <tem ...
- 【vue】canvas验证码组件--数字/数字加字母
基于canvas的数字/数字+字符验证码 SIdentify.vue 组件 <!-- 基于canvas的数字/数字+字符验证码 --> <!-- 调用格式 <s-ident ...
- Vue图片验证码-自定义组件高级版
最近项目中要用到图片验证码,网上一查有很多,基本都是千篇一律的4位纯数字验证码.首先得感谢那位一代目兄台提供的模板,由于不能满足需求,所以对其进行了改造升级. 经改造的图片验证码能满足一下情形使用:① ...
- 使用vue的extend自定义组件开发
index.js import Vue from 'vue' import tip from './tip.vue' const Constructor = Vue.extend(tip); cons ...
随机推荐
- 【转】GPS基线的精化处理
影响基线解算结果的因素主要有: (1)基线解算时所设定的起点坐标不准确. 起点坐标不准确,会导致基线出现尺度和方向上的偏差,造成的影响目前还没有较容易的方法来加以判别,因此,在实际工作中,只有尽量提高 ...
- Div+Css画太极图源代码
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>D ...
- mybatis支持oracle批量插入
问题:mysql使用mybatis批量插入时,通过foreach标签,将每条记录按照逗号","连接即可. 但是,oracle不支持. oracle支持如下写法: <inser ...
- operator重载运算符
1.重载运算符的函数一般格式如下 函数类型 operator 运算符名称 (形参表列) {对运算符的重载处理} 例如,想将"+"用于Complex(复数)的加法运算, ...
- 爬取西刺网的免费IP
在写爬虫时,经常需要切换IP,所以很有必要自已在数据维护库中维护一个IP池,这样,就可以在需用的时候随机切换IP,我的方法是爬取西刺网的免费IP,存入数据库中,然后在scrapy 工程中加入tools ...
- Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin
来源博客:Wang Jie's Blog 本文链接:<http://blog.wangjiegulu.com/2018/02/05/Android端生成META-INF信息文件的Gradle插件 ...
- BZOJ 4513: [Sdoi2016]储能表 [数位DP !]
4513: [Sdoi2016]储能表 题意:求\[ \sum_{i=0}^{n-1}\sum_{j=0}^{m-1} max((i\oplus j)-k,0) \] 写出来好开心啊...虽然思路不完 ...
- (python基础)时间辍time、时间元组localtime、时间格式化strftime
可以直接将下方代码运行查看结果:#!/usr/bin/python# coding=utf-8import time # 引入time模块# 时间戳:# 每个时间戳都以自从1970年1月1日午夜(历元 ...
- MySQL绿色版安装
下载MySQL绿色版 去官方下载mysql.,我下载的是 mysql-5.6.27-winx64,下载后解压缩到D:盘. 安装MySQL服务 拷贝my-default.ini重命名为my.ini,修改 ...
- 开启MySQL远程访问权限 允许远程连接
1.登陆mysql数据库 mysql -u root -p 查看user表 mysql> use mysql;Database changedmysql> select host,user ...