Vue数字输入框组件的使用方法


Posted in Javascript onOctober 19, 2019

最近在通过《Vue.js实战》系统学习Vue,虽然在项目中已多次使用Vue进行开发,但是对于一些非常基础性的知识点还不是很了解,因此这次通过结合数字输入框组件实战来谈谈简单的组件开发。

源代码:数字输入框组件

项目整体结构

├── src  项目代码
│ ├── common 公共js库
│ │ ├── number.js 判断是否为数字
│ ├── components 组件
│ │ ├── inputCount.vue 数字输入框组件
│ │ ├── inputNumber.vue 数字输入框调用页
| ├── router 路由
| | ├── index.js 路由相关操作
| ├── App.vue 入口页
| ├── main.js !Webpack配置约定的js入口,不要修改名称和路径

main.js

入口文件,主要作用是初始化vue实例并使用需要的插件

import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
 el: '#app',
 router,
 components: { App },
 template: '<App/>'
})

App.vue

主组件,所有页面都是在App.vue下进行切换的。所有的路由也是App.vue的子组件

<template>
 <div id="app">
  <router-view/>
 </div>
</template>

<script>
export default {
 name: 'App'
}
</script>

router/index.js

// import引入路由组件
import Vue from 'vue'
import Router from 'vue-router'
import inputNumber from '@/components/inputNumber'
Vue.use(Router)
// 然后定义路由(routes),并创建路由实例
export default new Router({
 routes: [
  {
   path: '/',
   name: 'index',
   component: inputNumber
  }
 ]
})

common/number.js

// 判断输入的值是否为数字
function isValueNumber (value) {
 var reg = /^[0-9]+.?[0-9]*$/
 if (reg.test(value)) {
  return true
 }
 return false
}
// 切记将此函数暴露,否则无法调用
export {
 isValueNumber
}

components/inputNumber.vue

<template>
 <div>
   // 双向绑定value,并设默认值为5,最大值为100,最小值为0
   <input-count v-model="value" :max="100" :min="0"></input-count>
 </div>
</template>

<script>
//引入子组件
import inputCount from '../components/inputCount'
export default {
 data () {
  return {
   value: 5 //设置初始值为5
  }
 },

 components: {
  inputCount
 }
}
</script>

components/inputCount.vue

<template>
 <div class="input-number">
  <input type="text" :value="currentValue" @change="handleChange" @keyup.down="handleDown" @keyup.up="handleUp"/>
  <button @click="handleDown" :disabled="currentValue <= min" >-</button>
  <button @click="handleUp" :disabled="currentValue >= max">+</button>
 </div>
</template>

input绑定了currentValue和原生的change事件,在句柄handleChagne函数中,因为绑定的currentValue是单向数据流,所以在输入时,currentValue的值并没有实时进行改变。如果输入的不是数字,就将输入的内容重置为之前的currentValue;如果输入的值是数字,就把输入的值赋给currentValue。

@keyup.down="handleDown"和@keyup.up="handleUp"实现在输入框聚焦时,对键盘上下按键的支持。

<script>
// 引入判断函数
import { isValueNumber } from '../common/number'
export default {
 data () {
  return {
   step: 10, // 控制步伐
   currentValue: this.value //初始化引用父组件value
  }
 },
 props: {
  max: {
   type: Number,
   default: Infinity
  },
  min: {
   type: Number,
   default: -Infinity
  },
  value: {
   type: Number,
   default: 0
  }
 },
 // 监听选项用来监听某个prop或data的改变,当它们发生变化时,就会触发watch配置的函数
 watch: {
  currentValue: function (val) {
   // 使用v-model时改变value
   this.$emit('input', val)
   // 触发自定义事件on-change事件,用于告知父组件数字输入框的值有所改变
   this.$emit('on-change', val)
  },
  value: function (val) {
   this.updateValue(val)
  }
 },
 methods: {
  handleDown: function () {
   if (this.currentValue <= this.min) return
   this.currentValue -= this.step
  },
  handleUp: function () {
   if (this.currentValue >= this.max) return
   this.currentValue += this.step
  },
  // 过滤出一个正确的currentValue
  updateValue: function (val) {
   if (val > this.max) val = this.max
   if (val < this.min) val = this.min
   this.currentValue = val
  },
  // 判断输入的值是否为数字
  handleChange: function (event) {
   // e.target.value:指向事件执行时鼠标所点击区域的那个元素的值
   // trim():删除字符串开始和末尾的空格
   var val = event.target.value.trim()
   var max = this.max
   var min = this.min
   if (isValueNumber(val)) {
    val = Number(val)
    this.currentValue = val
    if (val > max) {
     this.currentValue = max
    } else if (val < min) {
     this.currentValue = min
    }
   } else {
    event.target.value = this.currentValue
   }
  }
 },
 // 第一次初始化需对value进行过滤
 mounted: function () {
  this.updateValue(this.value)
 }
}
</script>

更多教程点击《Vue.js前端组件学习教程》,欢迎大家学习阅读。

关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
bootstrap table 服务器端分页例子分享
Feb 10 Javascript
jquery带下拉菜单和焦点图代码分享
Aug 24 Javascript
js实现瀑布流的三种方式比较
Jun 28 Javascript
jQuery四种选择器使用及示例
Jun 05 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
js querySelector() 使用方法
Dec 21 Javascript
JavaScript中捕获与冒泡详解及实例
Feb 03 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
vue-cli结合Element-ui基于cropper.js封装vue实现图片裁剪组件功能
Mar 01 Javascript
JS实现左边列表移到到右边列表功能
Mar 28 Javascript
vue实现路由监听和参数监听
Oct 29 Javascript
Vue最新防抖方案(必看篇)
Oct 30 Javascript
微信小程序实现禁止分享代码实例
Oct 19 #Javascript
Vue.js组件props数据验证实现详解
Oct 19 #Javascript
Vue.js组件使用props传递数据的方法
Oct 19 #Javascript
Vue.js数字输入框组件使用方法详解
Oct 19 #Javascript
JavaScript闭包相关知识解析
Oct 19 #Javascript
Vue.js组件通信之自定义事件详解
Oct 19 #Javascript
Vue.js自定义指令学习使用详解
Oct 19 #Javascript
You might like
php Calender(日历)代码分享
2014/01/03 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
PHP调用Mailgun发送邮件的方法
2017/05/04 PHP
jQuery get和post 方法传值注意事项
2009/11/03 Javascript
js 文件引入实现代码
2010/04/23 Javascript
seaJs的模块定义和模块加载浅析
2014/06/06 Javascript
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
2019/05/07 Javascript
新手该如何学python怎么学好python?
2008/10/07 Python
KMP算法精解及其Python版的代码示例
2016/06/01 Python
python 实现删除文件或文件夹实例详解
2016/12/04 Python
python selenium UI自动化解决验证码的4种方法
2018/01/05 Python
名片管理系统python版
2018/01/11 Python
Python面向对象class类属性及子类用法分析
2018/02/02 Python
python构建深度神经网络(DNN)
2018/03/10 Python
windows下python安装pip图文教程
2018/05/25 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
django settings.py 配置文件及介绍
2019/07/15 Python
PyTorch的SoftMax交叉熵损失和梯度用法
2020/01/15 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
产品开发计划书
2014/04/27 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
《总之就是很可爱》新作短篇动画《总之就是很可爱~制服~》将于2022年夏天播出
2022/04/07 日漫
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
Java实现贪吃蛇游戏的示例代码
2022/09/23 Java/Android