<!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)的更多相关文章

  1. 《vue.js实战》练习---数字输入框组件

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  2. vue.js2.0 自定义组件初体验

    理解 组件(Component)是 Vue.js 最强大的功能之一.组件可以扩展 HTML 元素,封装可重用的代码.在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能.在有些情况 ...

  3. Vue.extend提供自定义组件的构造器

    Vue.extend 返回的是一个“扩展实例构造器”,也就是预设了部分选项的Vue实例构造器.经常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件名称作为标签的自定义元 ...

  4. vue框架之自定义组件中使用v-model

    通常 vue在html常见表单空间支持v-model双向绑定例如 <input v-model="message" placeholder="edit me&quo ...

  5. vue怎么给自定义组件绑定原生事件

     下面主要以4个示例Demo演示(示例代码JS引用的Vue CDN),建议小伙伴直接复制示例代码运行查看, 赶时间的小伙伴可直接往下拉,看示例demo4 注:全局或局部注册的组件称为子组件,其中声明的 ...

  6. vue之全局自定义组件

    在项目开发中,往往需要使用到一些公共组件,比如,弹出消息.面包屑或者其它的组件,为了使用方便,将其以插件的形式融入到vue中,以面包屑插件为例: 1.创建公共组件MyBread.vue <tem ...

  7. 【vue】canvas验证码组件--数字/数字加字母

    基于canvas的数字/数字+字符验证码   SIdentify.vue 组件 <!-- 基于canvas的数字/数字+字符验证码 --> <!-- 调用格式 <s-ident ...

  8. Vue图片验证码-自定义组件高级版

    最近项目中要用到图片验证码,网上一查有很多,基本都是千篇一律的4位纯数字验证码.首先得感谢那位一代目兄台提供的模板,由于不能满足需求,所以对其进行了改造升级. 经改造的图片验证码能满足一下情形使用:① ...

  9. 使用vue的extend自定义组件开发

    index.js import Vue from 'vue' import tip from './tip.vue' const Constructor = Vue.extend(tip); cons ...

随机推荐

  1. mysql(4)—— 表连接查询与where后使用子查询的性能分析。

    子查询就是在一条查询语句中还有其它的查询语句,主查询得到的结果依赖于子查询的结果. 子查询的子语句可以在一条sql语句的FROM,JOIN,和WHERE后面,本文主要针对在WHERE后面使用子查询与表 ...

  2. 树莓派小车By 树莓派爱好者ITJoker(通过C socket通信实现树莓派视频小车)(二)

    前面的方法可以参照(一)来配置GPIO口. 下面是代码...仅供参考,转载请注明出处. 1.  先输入以下指令,再复制代码,Ctrl+X  输入Y  回车  保存. sudo nano start.c ...

  3. Windows系统安装pip方法

    pip是一款非常方便的python包管理工具,本文主要介绍在windows 10系统下安装pip方法. 1. 下载pip 地址:https://pypi.python.org/pypi/pip#dow ...

  4. COGNOS安装与发布报表步骤

    1. 安装 1.1安装前准备 安装COGNOS需要先安装好iis和sql Server(因为我们用的数据库系统就是SQLServer). 1.2安装过程 1)    找到BI Server文件 2)  ...

  5. 梅安森元图地图开放平台、专业GIS地图平台

    元图地图开放平台:http://map.cmetamap.com/?from=groupmessage 梅安森元图地图开放平台: 自主知识产权,专业GIS地图平台,用简单语言即可轻松操作复杂的互联网地 ...

  6. HDU2089 不要62 BZOJ1026: [SCOI2009]windy数 [数位DP]

    基础题复习 这次用了dfs写法,感觉比较好 #include <iostream> #include <cstdio> #include <cstring> #in ...

  7. Go基础之--接口

    定义 在Go语言中,一个类只要实现了接口要求的所有函数,我们就说这个类实现了该接口 interface类型可以定义一组方法,用来表示一个对象的行为特征,interface不能包含任何变量,接口是引用类 ...

  8. c# Nlog 非xml cs方法配置

    public static void InitLog(TargetWithLayout target = null, string level = "Debug", string ...

  9. 读书共享 Primer Plus C-part 5

    第五章 运算符.表达式和语句 关于+- 的一元运算符和二元运算符的区别 a++:a先创建自身的一个副本,然后a自增1,最后返回副本的值 a+=1: 事实上相当于++a a=a+1: 虽然有点雷同于a+ ...

  10. PLECS—模型仿真——第十一周作业

    1. 直流电机单闭环调速系统比例控制仿真 (1)整体电路图 (2)控制部分电路图 (3)参数设置+仿真结果 2. 直流电机单闭环调速系统比例积分控制仿真 (1)参数设置 (2)仿真结果 3. 直流电机 ...