vue+Ant?Design進(jìn)度條滑塊與input聯(lián)動(dòng)效果實(shí)現(xiàn)
需求:滑塊進(jìn)度與輸入框?yàn)橐恢?默認(rèn)值為80,最小不能小于30,最大為100
子組件:
<template> <div class="progress-box"> <div ref="slider" class="slider" > <div class="process" :style="{ width }" ></div> <div ref="trunk" class="thunk" :style="{ left }" > <div class="block"></div> </div> </div> <div> <a-input-number v-model="per" class="input-num" :min="inputMin" :max="inputMax" @change="handleChangeNum" /> </div> </div> </template> <script> export default { props: { sliderMin: { // 最小值 type: Number, default: 0 }, sliderMax: { // 進(jìn)度條最大值 type: Number, default: 0 }, value: { // 對(duì)當(dāng)前值進(jìn)行雙向綁定實(shí)時(shí)顯示拖拽進(jìn)度 type: Number, default: 0 }, inputMin: { type: Number, default: 0 }, inputMax: { type: Number, default: 100 } }, data() { return { slider: null, // 滾動(dòng)條DOM元素 thunk: null, // 拖拽DOM元素 per: Math.max(this.sliderMin, this.value) // 當(dāng)前值 } }, computed: { // 設(shè)置一個(gè)百分比,提供計(jì)算slider進(jìn)度寬度和trunk的left值 scale() { // 百分比 return this.per / this.sliderMax }, width() { if (this.slider) { // 設(shè)置進(jìn)度激活的寬度 return (this.slider.offsetWidth * this.scale) + 'px' } else { return 0 + 'px' } }, left() { // trunk left = slider進(jìn)度width + trunk寬度/2 if (this.slider) { // 設(shè)置圓點(diǎn)所在的位置 return (this.slider.offsetWidth * this.scale) - this.thunk.offsetWidth / 2 + 'px' } else { return 0 + 'px' } } }, // 渲染到頁面的時(shí)候 mounted() { this.slider = this.$refs.slider this.thunk = this.$refs.trunk const _this = this this.thunk.onmousedown = function(e) { const width = parseInt(_this.width) const disX = e.clientX document.onmousemove = function(e) { // 拖拽的時(shí)候獲取的新width const newWidth = (e.clientX - disX + width) // 拖拽的時(shí)候得到新的百分比 const scale = newWidth / _this.slider.offsetWidth _this.per = Math.ceil((_this.sliderMax) * scale)// 對(duì)一個(gè)數(shù)進(jìn)行上取整把小數(shù)轉(zhuǎn)為整數(shù)(0.3=>30) _this.per = Math.max(_this.per, _this.sliderMin) _this.per = Math.min(_this.per, _this.sliderMax) _this.$emit('input', _this.per) } document.onmouseup = function() { document.onmousemove = document.onmouseup = null } return false } }, methods: { handleChangeNum(e) { this.per = e } } } </script> <style lang="scss" scoped> .progress-box { display: flex; align-items: center; justify-content: space-between; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .clear:after { content: ''; display: block; clear: both; } .slider { user-select: none; position: relative; width: calc(100% - 104px); height: 4px; background: #f5f5f5; border-radius: 5px; cursor: pointer; .process { position: absolute; left: 0; top: 0; width: 112px; height: 6px; border-radius: 5px; background: #3296fa; } .thunk { position: absolute; left: 100px; top: -5px; width: 14px; height: 14px; } .block { width: 14px; height: 14px; border-radius: 50%; border: 2px solid #3296fa; background: rgba(255, 255, 255, 1); transition: 0.2s all; } } </style>
父組件使用
<div class="xk-control-item"> <div class="xk-item-title"> <span>相似度(≥)</span> </div> <div class="xk-item-value"> <c-progress v-model="per" :sliderMin="30" :sliderMax="100" :inputMin='30' /> </div> </div> <script> import CProgress from '@/components/CProgress' export default { name: 'VisitorTrack', components: { CProgress }, data() { return { } }, computed: { per: { get() { return 80 }, set(val) { // console.log(val) } } }, watch: { }, methods: { } } </script>
補(bǔ)充知識(shí)
ant-design-vue 動(dòng)態(tài)添加input行及動(dòng)態(tài)校驗(yàn)
這里涉及到動(dòng)態(tài)input表單校驗(yàn) 我僅給自己記錄一下
<!-- 動(dòng)態(tài)添加行 --> <a-form-model-item :wrapper-col="newWrapper" style="padding-left:63px;padding-right:40px;" v-for="(item, index) in form.information" :key="item.key" > <a-form-model-item class="fl" :prop="'information.' + index + '.name'" :rules="{ required: true, message: '店鋪名不能為空', trigger: ['blur','change'], }"> <a-input v-model.trim="form.information[index].name" placeholder="請(qǐng)輸入店鋪名稱" style="margin-right: 1%" /> </a-form-model-item> <a-form-model-item class="fl" :prop="'information.' + index + '.address'" :rules="{ required: true, message: '店鋪地址不能為空', trigger: ['blur','change'], }"> <a-input v-model.trim="form.information[index].address" placeholder="請(qǐng)輸入店鋪地址" style="margin-right: 1%" /> </a-form-model-item> <a-form-model-item class="fl" :prop="'information.' + index + '.storeManagerName'" :rules="{ required: true, message: '店長姓名不能為空', trigger: ['blur','change'], }"> <a-input v-model.trim="form.information[index].storeManagerName" placeholder="請(qǐng)輸入店長姓名" style="margin-right: 1%" /> </a-form-model-item> <a-form-model-item class="fl" style="margin-right: 3%;" :prop="'information.' + index + '.storeManagerPhone'" :rules="[{required: true,message: '店長手機(jī)不能為空',trigger: ['blur','change']}, {validator: mobilephoneValidate,trigger: ['blur','change'] }]" > <a-input v-model.trim="form.information[index].storeManagerPhone" placeholder="請(qǐng)輸入店長手機(jī)號(hào)" /> </a-form-model-item> <a v-if="form.information.length > 1" :disabled="form.information.length === 1" @click="removeRows(item)" >刪除</a> </a-form-model-item>
添加 刪除的方法
// 動(dòng)態(tài)刪除添加輸入行 removeRows(item) { let index = this.form.information.indexOf(item); if (index !== -1) { this.form.information.splice(index, 1); } }, addRows() { this.form.information.push({ name: '', address: '', storeManagerName: '', storeManagerPhone: '', key: Date.now(), }); },
手機(jī)號(hào)或者其他單獨(dú)的表單校驗(yàn)寫在methods里
// 動(dòng)態(tài)添加行 店長手機(jī)號(hào)驗(yàn)證 testMobilephone: function (str) { const regex = /^1[3456789]\d{9}$/ if (!regex.test(str)) { return false } else { return true } }, mobilephoneValidate (rule, value, callback) { // 主要就是添加一個(gè)對(duì)undefined和空串的判斷 if (typeof (value) === 'undefined' || value === '') { callback() } else { if (!this.testMobilephone(value)) { callback(new Error('請(qǐng)輸入正確手機(jī)格式')) } callback() } },
這里information數(shù)組 在data里寫上一組空對(duì)象 是為了保證有一組input行顯示出來 不寫input行則會(huì)隱藏掉
到此這篇關(guān)于vue+Ant Design進(jìn)度條滑塊與input聯(lián)動(dòng)的文章就介紹到這了,更多相關(guān)vue+Ant Design進(jìn)度條滑塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue使用正則校驗(yàn)文本框?yàn)檎麛?shù)
這篇文章主要介紹了Vue使用正則校驗(yàn)文本框?yàn)檎麛?shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10