Vant2移動(dòng)端Vue組件庫(kù)問(wèn)題記錄
發(fā)布初衷 :
記錄在移動(dòng)端項(xiàng)目中使用 Vant 2 組件庫(kù)時(shí)遇到的各種問(wèn)題 ,
方便以后再次遇到類(lèi)似問(wèn)題 , 能夠快時(shí)查閱解決

Popup 彈出層
介紹
彈出層容器,用于展示彈窗、信息提示等內(nèi)容,支持多個(gè)彈出層疊加展示。
問(wèn)題記錄 : Field 輸入框 和 Popup 彈出層 兩個(gè) 結(jié)合 使用 時(shí) ,
在 iPhone 真機(jī)上測(cè)試的時(shí)候 出現(xiàn)的一個(gè)小 bug :
點(diǎn)擊 Field 輸入框 的時(shí)候 , 第一次會(huì) 彈出 一個(gè) 手機(jī)的鍵盤(pán)輸入框 ,
點(diǎn)擊第二次的時(shí)候 才出來(lái) Popup 彈出層 里面的內(nèi)容 ( 比如 日期選擇器 )
解決方案 :
給 Field 輸入框 設(shè)置 readonly ,通過(guò)
readonly將輸入框設(shè)置為只讀狀態(tài)
輸入框
van-field必須得加入readonly這個(gè) 只讀屬性 ,不然會(huì)導(dǎo)致 用戶(hù)手機(jī) 觸發(fā) 默認(rèn)鍵盤(pán) 遮擋 你的彈窗和選擇器內(nèi)容 影響體驗(yàn)
也不要用
disabled來(lái)禁用輸入框 , 樣式會(huì)變成禁用狀態(tài)下的樣式很難改動(dòng)只需要設(shè)置為只讀即可 , 也不會(huì)觸發(fā)手機(jī)鍵盤(pán)
DatetimePicker 時(shí)間選擇
介紹
時(shí)間選擇器,支持日期、年月、時(shí)分等維度,通常與彈出層組件配合使用。
確認(rèn)選擇的時(shí)間數(shù)據(jù)是需要自己處理的,詳見(jiàn) confirmPicker 方法
<template>
<div class="seller">
<van-cell
title="開(kāi)始時(shí)間"
is-link
:value-class="className"
:value="timeValue"
@click="showPopup" />
<van-popup v-model="show" position="bottom">
<van-datetime-picker
v-model="currentDate"
type="datetime"
title="選擇時(shí)間"
:loading="isLoadingShow"
:min-date="minDate"
:max-date="maxDate"
:formatter="formatter"
@cancel="show = false"
@confirm="confirmPicker"
/>
</van-popup>
</div>
</template>
<script>
export default {
name: 'Seller',
data () {
return {
msg: '商家頁(yè)面',
timeValue: '請(qǐng)選擇時(shí)間',
show: false,
isLoadingShow: true,
currentDate: new Date(),
minDate: new Date(),
maxDate: new Date(2020, 12, 31),
className: ''
}
},
methods: {
// 顯示彈窗
showPopup () {
this.show = true
this.isLoadingShow = true
setTimeout(() => {
this.isLoadingShow = false
}, 500)
},
// 確認(rèn)選擇的時(shí)間
confirmPicker (val) {
let year = val.getFullYear()
let month = val.getMonth() + 1
let day = val.getDate()
let hour = val.getHours()
let minute = val.getMinutes()
if (month >= 1 && month <= 9) { month = `0${month}` }
if (day >= 1 && day <= 9) { day = `0${day}` }
if (hour >= 0 && hour <= 9) { hour = `0${hour}` }
if (minute >= 0 && minute <= 9) { minute = `0${minute}` }
this.className = 'timeClass'
this.timeValue = `${year}-${month}-${day} ${hour}:${minute}`
this.show = false
},
// 選項(xiàng)格式化函數(shù)
formatter (type, value) {
if (type === 'year') {
return `${value}年`
} else if (type === 'month') {
return `${value}月`
} else if (type === 'day') {
return `${value}日`
} else if (type === 'hour') {
return `${value}時(shí)`
} else if (type === 'minute') {
return `${value}分`
} else if (type === 'second') {
return `${value}秒`
}
return value
}
}
}
</script>
<style lang="stylus" rel="stylesheet/stylus" scoped>
.seller
.timeClass {
color: #333;
}
</style>
Field 輸入框
介紹
表單中的輸入框組件。
問(wèn)題記錄 : Field 輸入框 和 Popup 彈出層 兩個(gè) 結(jié)合 使用 時(shí) ,
在 iPhone 真機(jī) 上測(cè)試的時(shí)候 出現(xiàn)的一個(gè)小 bug :
點(diǎn)擊 Field 輸入框 的時(shí)候 , 第一次會(huì) 彈出 一個(gè) 手機(jī)的鍵盤(pán)輸入框 ,
點(diǎn)擊第二次的時(shí)候 才出來(lái) Popup 彈出層 里面的內(nèi)容 ( 比如 日期選擇器 )
解決方案 :
給 Field 輸入框 設(shè)置 readonly ,通過(guò)
readonly將輸入框設(shè)置為只讀狀態(tài)
輸入框
van-field必須得加入readonly這個(gè) 只讀屬性 ,不然會(huì)導(dǎo)致 用戶(hù)手機(jī) 觸發(fā) 默認(rèn)鍵盤(pán) 遮擋 你的彈窗和選擇器內(nèi)容 影響體驗(yàn)
也不要用
disabled來(lái)禁用輸入框 , 樣式會(huì)變成禁用狀態(tài)下的樣式很難改動(dòng)只需要設(shè)置為只讀即可 , 也不會(huì)觸發(fā)手機(jī)鍵盤(pán)
Picker 選擇器
介紹
提供多個(gè)選項(xiàng)集合供用戶(hù)選擇,支持單列選擇和多列級(jí)聯(lián),通常與彈出層組件配合使用。
業(yè)務(wù)場(chǎng)景 :
一開(kāi)始以為只能渲染純數(shù)組
但后來(lái)用的時(shí)候 , 后端返回來(lái)的數(shù)據(jù)結(jié)構(gòu)是 數(shù)組嵌套對(duì)象的模式 ,
因此還特意將數(shù)組對(duì)象里面的數(shù)據(jù)專(zhuān)門(mén)篩選出來(lái)一個(gè)新數(shù)組用于渲染。。
但后來(lái)傳參的時(shí)候需要數(shù)據(jù)結(jié)構(gòu)里面的其他數(shù)據(jù)用于傳參
所以又找了找這個(gè)Picker選擇器可不可以渲染數(shù)組對(duì)象結(jié)構(gòu)的案例 :
發(fā)現(xiàn) [ { } ] , 是可以渲染的 ,只不過(guò)還要做一下處理 :
使用案例 :
<van-popup v-model="showTitle" position="bottom" > <van-picker title="標(biāo)題" show-toolbar value-key="name" :columns="columns" @confirm="onConfirm" @cancel="onCancel" /> </van-popup>export default { data() { return { showTitle: false, columns: [], // 后端請(qǐng)求的數(shù)據(jù) queryFrom: { id: null, name: '', } }; }, methods: { onConfirm(value, index) { this.queryFrom.id = value.id // 需要傳給后端的id值 this.queryFrom.name = value.name // 用于渲染選擇器列表數(shù)據(jù) this.showTitle = false // 關(guān)閉彈出層 }, onCancel() { this.showTitle = false }, }, };


補(bǔ)充知識(shí) :
vant-ui 之 Field 輸入框 和 Picker 結(jié)合使用時(shí) ,如何綁定正確的 id 類(lèi)型的值的問(wèn)題 。
很常見(jiàn)的需求 :
表單中的一項(xiàng) ,需要從 picker 控件中選擇正確的值后 ,展示的是字符串 ,
然后提交到后臺(tái)服務(wù)器的則是字符串對(duì)應(yīng)的 value 類(lèi)型的值的問(wèn)題。

點(diǎn)擊表單的檔案組,彈出 Picker 選擇組件 ,選擇正確的值 ,填充到表單項(xiàng) ,但是 ,
提交到服務(wù)器去,需要提交對(duì)應(yīng)的 id ,而不是看到的字符串。
如何實(shí)現(xiàn) ?
定義兩個(gè)屬性,id 和 name , 兩個(gè)是一 一對(duì)應(yīng)的關(guān)系 。
在 van-picker 中 ,綁定的 confirm 函數(shù) ,參數(shù)獲取到的是一個(gè)對(duì)象
在這個(gè)函數(shù)內(nèi),同時(shí)更新 id 和 name ,保證他倆一 一對(duì)應(yīng) 。
onConfirm(value, index) {
this.queryFrom.id = value.id // 需要傳給后端的id值
this.queryFrom.name = value.name // 用于渲染選擇器列表數(shù)據(jù)
this.showTitle = false // 關(guān)閉彈出層
},如何展示 默認(rèn)選中項(xiàng)
項(xiàng)目使用背景 :
用戶(hù)填寫(xiě)表單時(shí) , 需要根據(jù)上面填寫(xiě)的 乘車(chē)人數(shù) 來(lái)自動(dòng)讓下面的 Picker 選擇器
下拉時(shí) 默認(rèn)值 展示 與 人數(shù)相匹配 的 車(chē)輛類(lèi)型
而又由于車(chē)輛類(lèi)型是后端返回的數(shù)據(jù) , 并不是固定不變的 , 所以前端沒(méi)辦法寫(xiě)死匹配方法
1、用戶(hù)輸入完 乘車(chē)人數(shù) 后 , 自動(dòng)發(fā)起請(qǐng)求 , 由后端來(lái)匹配相對(duì)應(yīng)的車(chē)輛類(lèi)型
2、但是這里前端 Picker 組件需要用其索引值來(lái)展示下拉默認(rèn)值 , 后端又無(wú)法返給我索引
3、前端這里只能先請(qǐng)求車(chē)輛類(lèi)型數(shù)據(jù)列表后 , 再請(qǐng)求匹配車(chē)型數(shù)據(jù)值 , 循環(huán)去匹配后拿到當(dāng)前匹配的索引值后再賦值給 Picker 組件
代碼實(shí)現(xiàn) :
根據(jù)乘車(chē)人數(shù)展示默認(rèn)選中項(xiàng) <van-picker show-toolbar title="車(chē)輛類(lèi)型" value-key="dictLabel" :default-index="defaultMatch" :columns="applyType" /> data() { return { defaultMatch: 0, // 車(chē)輛類(lèi)型下拉展示默認(rèn)索引值 applyType: [], // 車(chē)輛類(lèi)型列表 } } methods: { // 根據(jù)乘車(chē)人數(shù)自動(dòng)匹配車(chē)輛類(lèi)型 async blurMatchType() { let arr = [] // 先請(qǐng)求車(chē)輛類(lèi)型列表數(shù)據(jù)用于匹配 let res = await this.getDicts('car_apply_type') if (res.code == 200) arr = res.data // 根據(jù)乘車(chē)人數(shù)請(qǐng)求匹配的車(chē)輛類(lèi)型值 let ret = await getMatchType(this.userCarForm.riderNum) const { code, data } = ret if (code == 200) { // 循環(huán)匹配后賦值其索引值 arr.forEach((item, index) => { if (item.dictValue == data) { this.defaultMatch = index } }) } } }
List 列表
介紹
瀑布流滾動(dòng)加載,用于展示長(zhǎng)列表,當(dāng)列表即將滾動(dòng)到底部時(shí),會(huì)觸發(fā)事件并加載更多列表項(xiàng)。
List 組件通過(guò) loading 和 finished 兩個(gè)變量控制加載狀態(tài),當(dāng)組件滾動(dòng)到底部時(shí),會(huì)觸發(fā) load 事件并將 loading 設(shè)置成 true。
此時(shí)可以發(fā)起異步操作并更新數(shù)據(jù),數(shù)據(jù)更新完畢后,將 loading 設(shè)置成 false 即可。
若數(shù)據(jù)已全部加載完畢,則直接將 finished 設(shè)置成 true 即可。
<van-list
v-model="loading"
:finished="finished"
:finished-text="appList.length ? '沒(méi)有更多了' : ''"
@load="onLoad"
>
<van-cell v-for="item in appList" :key="item" :title="item" />
</van-list>
export default {
data() {
return {
loading: false,
finished: false,
appList: [], // 用車(chē)申請(qǐng)列表
appQuery: {
page: '1', // 要查詢(xún)的頁(yè)碼
rows: '10', // 每頁(yè)記錄數(shù)量
userId: null, // 用戶(hù) Id
}
};
},
methods: {
async onLoad() {
// 異步更新數(shù)據(jù)
let ret = await getAppList(this.appQuery)
const { code, data } = ret
if (code == 200) {
this.appList = this.appList.concat(data.rows)
// 加載狀態(tài)結(jié)束
this.loading = false;
if (this.appList.length >= data.total) {
// 沒(méi)有更多數(shù)據(jù)了
this.finished = true;
Notify({
message: '已加載完全部訂單',
background: '#ee0a24'
})
} else {
this.appQuery.page++
}
}
},
},
};以上是正常情況下 , onLoad 滾動(dòng)到底部可以正常觸發(fā)加載下一頁(yè)數(shù)據(jù)
接下來(lái)就是說(shuō)明一個(gè)不正常使用情況 , 此 bug 組件庫(kù)還未修復(fù)
就是 和 Tab 標(biāo)簽頁(yè) 組件 公用 :
我猜估計(jì)是包裹內(nèi)容的高度它無(wú)法斷定了吧 , 所以 onLoad 加載就有問(wèn)題了
Tab 標(biāo)簽頁(yè)
<van-tabs v-model="active">
<van-tab title="標(biāo)簽 1">
<ApprovalItem type='1' />
</van-tab>
<van-tab title="標(biāo)簽 2">
<ApprovalItem type='2' />
</van-tab>
<van-tab title="標(biāo)簽 3">
<ApprovalItem type='3' />
</van-tab>
<van-tab title="標(biāo)簽 4">
<ApprovalItem type='4' />
</van-tab>
</van-tabs>
data() {
return {
active: 2,
};
},主要注意點(diǎn)就是子組件的高度需要設(shè)置一下 ,
一開(kāi)始嘗試的給 ApprovalItem 子組件一個(gè)高度 height:100% ,
但并沒(méi)有解決一直觸發(fā) onLoad 加載的問(wèn)題 ,
后來(lái)改成 height:100vh , 就 OK 了 。。
沒(méi)別的了 , 就是記錄一下 , 提醒避坑 。
總結(jié)
到此這篇關(guān)于Vant2移動(dòng)端Vue組件庫(kù)問(wèn)題記錄的文章就介紹到這了,更多相關(guān)Vant2移動(dòng)端Vue組件庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue前端導(dǎo)出多級(jí)表頭的excel表的示例代碼
本文主要介紹了vue前端導(dǎo)出多級(jí)表頭的excel表的示例代碼,可以使用xlsx庫(kù)來(lái)創(chuàng)建Excel文件,下面就來(lái)具體介紹一下,感興趣的可以了解一下2024-06-06
antd?select?多選限制個(gè)數(shù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了antd?select?多選限制個(gè)數(shù),實(shí)現(xiàn)思路和核心代碼都很簡(jiǎn)單,其中核心代碼在于disabled,代碼簡(jiǎn)單易懂需要的朋友可以參考下2022-11-11
關(guān)于vue-admin-template模板連接后端改造登錄功能
這篇文章主要介紹了關(guān)于vue-admin-template模板連接后端改造登錄功能,登陸方法根據(jù)賬號(hào)密碼查出用戶(hù)信息,根據(jù)用戶(hù)id與name生成token并返回,userinfo則是對(duì)token進(jìn)行獲取,在查出對(duì)應(yīng)值進(jìn)行返回,感興趣的朋友一起看看吧2022-05-05
vue?路由切換過(guò)渡動(dòng)效滑入滑出效果的實(shí)例代碼
在支付寶賬單頁(yè)面有這樣一個(gè)特效切換過(guò)渡動(dòng)效滑入滑出效果,非常方便實(shí)用,那么這個(gè)功能如何實(shí)現(xiàn)的呢?下面小編通過(guò)vue實(shí)現(xiàn)路由切換過(guò)渡動(dòng)效滑入滑出效果,感興趣的朋友一起看看吧2022-03-03
Vuex持久化存儲(chǔ)之vuex-persist問(wèn)題
這篇文章主要介紹了Vuex持久化存儲(chǔ)之vuex-persist問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
vue和react的區(qū)別及優(yōu)缺點(diǎn)解讀
這篇文章主要介紹了vue和react的區(qū)別及優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Vant實(shí)現(xiàn)上傳多個(gè)圖片或視頻,更改視頻預(yù)覽圖
這篇文章主要介紹了Vant實(shí)現(xiàn)上傳多個(gè)圖片或視頻,更改視頻預(yù)覽圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10
如何實(shí)現(xiàn)vue加載指令 v-loading
在日常的開(kāi)發(fā)中,加載效果是非常常見(jiàn)的,但是怎么才能方便的使用,本文介紹如何實(shí)現(xiàn)vue加載指令 v-loading,感興趣的朋友一起看看吧2024-01-01
vant list組件滾動(dòng)保留滾動(dòng)條位置
這篇文章主要介紹了vant list組件滾動(dòng)保留滾動(dòng)條位置,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09







