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

