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 ...
随机推荐
- SEO—Meta标签优化
Meta标签之一"标题": 标题是网站中很重要的一个标签,他在搜索引擎中是直接显示出来的,一般情况下要网站的核心关键词和网站名称都写进去,这样更有利于网站的排名.但是要注意标题的长 ...
- 【转】GAMITBLOBK中固定解、浮点解、约束解、松弛解等解类型解释
在GAMIT/GLOBK的使用过程中,经常会碰到固定解.浮点解.约束解.松弛解及其相关组合解(如约束固定解)等词汇,对于初学者,一时难以弄明白其中的含义,一般只有按部就班按照教程中,怎么说就怎么弄,不 ...
- 模块dll和lib
一.dll动态链接库 1.dll 没有 main 函数 2.不能直接执行,可以注入exe中让它间接执行.只有把它编译到应用程序中才可以. 3.编写dll 函数前加上 _declspec(dllexpo ...
- JDBC访问及操作SQLite数据库
SQLite 是一个开源的嵌入式关系数据库,其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下,只要确保SQLite的二进 ...
- setinIerval和setTimeout的区别?
setTimeout和setInterval的使用 这两个方法都可以用来实现在一个固定时间段之后去执行JavaScript.不过两者各有各的应用场景. 方 法 实际上,setTimeout和setIn ...
- BZOJ 1502: [NOI2005]月下柠檬树 [辛普森积分 解析几何 圆]
1502: [NOI2005]月下柠檬树 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1070 Solved: 596[Submit][Status] ...
- Ubuntu下Nginx启动、停止等常用命令
本文详细介绍Ubuntu下Nginx启动.停止等常用命令.在开发过程中,我们会经常的修改Nginx的配置文件,每次修改配置文件都可以先测试下本次修改的配置文件是否正确,可以利用以下命令: servic ...
- 快速构建一个简单的单页vue应用
技术栈 vue-cli webpack vux,vux-loader less,less-loader vue-jsonp vue-scroller ES6 vue-cli:一个vue脚手架工具,利用 ...
- JavaScript使用点滴
JavaScript使用点滴 一.字符串替换的小插曲 遇到一个小插曲,想要把后台返回的字符串输出给前端视图,字符串中包含\n换行,需要使用javascript对其进行替换成<br />. ...
- 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS
HTTP 协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的 HTTP 的网站是不太安全的.所以, Google 的 Chrome 浏览器 ...