vue+Ant?Design進度條滑塊與input聯(lián)動效果實現(xiàn)
更新時間:2022年12月07日 15:16:19 作者:周家大小姐.
最近接到這樣一個需求滑塊進度與輸入框為一致,默認值為80,最小不能小于30,最大為100,怎么實現(xiàn)這個聯(lián)動效果呢,下面小編給大家分享下基于vue+Ant?Design進度條滑塊與input聯(lián)動效果的實現(xià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: { // 進度條最大值 type: Number, default: 0 }, value: { // 對當前值進行雙向綁定實時顯示拖拽進度 type: Number, default: 0 }, inputMin: { type: Number, default: 0 }, inputMax: { type: Number, default: 100 } }, data() { return { slider: null, // 滾動條DOM元素 thunk: null, // 拖拽DOM元素 per: Math.max(this.sliderMin, this.value) // 當前值 } }, computed: { // 設置一個百分比,提供計算slider進度寬度和trunk的left值 scale() { // 百分比 return this.per / this.sliderMax }, width() { if (this.slider) { // 設置進度激活的寬度 return (this.slider.offsetWidth * this.scale) + 'px' } else { return 0 + 'px' } }, left() { // trunk left = slider進度width + trunk寬度/2 if (this.slider) { // 設置圓點所在的位置 return (this.slider.offsetWidth * this.scale) - this.thunk.offsetWidth / 2 + 'px' } else { return 0 + 'px' } } }, // 渲染到頁面的時候 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) { // 拖拽的時候獲取的新width const newWidth = (e.clientX - disX + width) // 拖拽的時候得到新的百分比 const scale = newWidth / _this.slider.offsetWidth _this.per = Math.ceil((_this.sliderMax) * scale)// 對一個數(shù)進行上取整把小數(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>
補充知識
ant-design-vue 動態(tài)添加input行及動態(tài)校驗
這里涉及到動態(tài)input表單校驗 我僅給自己記錄一下
<!-- 動態(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="請輸入店鋪名稱" 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="請輸入店鋪地址" 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="請輸入店長姓名" 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: '店長手機不能為空',trigger: ['blur','change']}, {validator: mobilephoneValidate,trigger: ['blur','change'] }]" > <a-input v-model.trim="form.information[index].storeManagerPhone" placeholder="請輸入店長手機號" /> </a-form-model-item> <a v-if="form.information.length > 1" :disabled="form.information.length === 1" @click="removeRows(item)" >刪除</a> </a-form-model-item>
添加 刪除的方法
// 動態(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(), }); },
手機號或者其他單獨的表單校驗寫在methods里
// 動態(tài)添加行 店長手機號驗證 testMobilephone: function (str) { const regex = /^1[3456789]\d{9}$/ if (!regex.test(str)) { return false } else { return true } }, mobilephoneValidate (rule, value, callback) { // 主要就是添加一個對undefined和空串的判斷 if (typeof (value) === 'undefined' || value === '') { callback() } else { if (!this.testMobilephone(value)) { callback(new Error('請輸入正確手機格式')) } callback() } },
這里information數(shù)組 在data里寫上一組空對象 是為了保證有一組input行顯示出來 不寫input行則會隱藏掉
到此這篇關(guān)于vue+Ant Design進度條滑塊與input聯(lián)動的文章就介紹到這了,更多相關(guān)vue+Ant Design進度條滑塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!