Uni-App用uView組件庫中u-picker實(shí)現(xiàn)地區(qū)的省-市-區(qū)三級聯(lián)動、確認(rèn)及回顯
一:準(zhǔn)備工作
組件的引入就不多贅述了 直接看使用方法
二:json文件數(shù)據(jù)
地址我是引入的json文件數(shù)據(jù)結(jié)構(gòu)大概是這個樣子
例1
例2
三:先做個按鈕做彈窗顯示
做個動態(tài)style,控制是否高亮地址
<u-form-item label="地區(qū)" :border-bottom="false"> <u-cell :border="false"> <view slot="right-icon" @tap="showLocal = true"> <text :style="{ color: local.length ? '#333' : '#c0c4cc' }">{{ local === '' ? '選擇省/市/區(qū)' : local }}</text> </view> </u-cell> </u-form-item>
四:使用組件
<u-picker @cancel="showLocal = false" @close="showLocal = false" :show="showLocal" :columns="addressColumns" @confirm="localConfirm" title="請選擇所在地" keyName="name" itemHeight="80" closeOnClickOverlay ref="uPicker" @change="changeHandler" :defaultIndex="defaultAddress" immediateChange ></u-picker>
五:用到的變量
import areas from '@/utils/areas.json'//引入原始數(shù)據(jù) export default { data(){ return { local: '', //區(qū)域 localCode: '', //這個變量看個人需求使用 showLocal: false, //是否展示彈出層 addressColumns: [], //數(shù)據(jù)數(shù)組 defaultAddress: [], //默認(rèn)選中 (回填時或者初次顯示默認(rèn)選中) addressData: areas, //原始數(shù)據(jù) (引入的json文件) } } }
六:初始化數(shù)據(jù)
onShow() { //省的數(shù)組 const provinceData = areas.map(e => { return { name: e.name, code: e.code }//這里可以直接return e.name 這里我是要用到code所以才用對象包起來的 下面的市 區(qū) 也一樣 }) //市的數(shù)組 const cityData = areas.map(e => { const arr = [] arr.push( e.areas.map(c => { return { name: c.name, code: c.code } }) ) return arr }) //區(qū)的數(shù)組 const areaData = areas.map(e => { const arr = [] arr.push( e.areas.map(c => c.areas.map(d => { return { name: d.name, code: d.code } }) ) ) return arr }) const arr = [provinceData, cityData[0][0], areaData[0][0][0]] this.addressColumns = arr //將得到的3個數(shù)組 的第一個市的所有數(shù)據(jù)賦值 作為初始數(shù)據(jù) },
七:數(shù)據(jù)變更時的方法
changeHandler(e) { //分別表示選中的列 , 該列的第幾個,選中的3列的第幾個的數(shù)組,組件本身 const { columnIndex, index, indexs, picker = this.$refs.uPicker } = e //如果改變的是第一列 if (columnIndex === 0) { const children1 = this.addressData[index].areas.map(e => { return { name: e.name, code: e.code } }) picker.setColumnValues(1, children1) //更換 第二列數(shù)據(jù) const children2 = this.addressData[index].areas[indexs[1]].areas.map(e => { return { name: e.name, code: e.code } }) picker.setColumnValues(2, children2) //更換 第三列數(shù)據(jù) } if (columnIndex === 1) { //如果改變的是第二列 const children3 = this.addressData[indexs[0]].areas[indexs[1]].areas.map(e => { return { name: e.name, code: e.code } }) picker.setColumnValues(2, children3) //更換 第三列數(shù)據(jù) } },
八:點(diǎn)擊確認(rèn)時的方法
localConfirm(e) { //顯而易見 不多贅述 this.local = `${e.value[0].name}-${e.value[1].name}-${e.value[2].name}` this.localCode = `${e.value[0].code}-${e.value[1].code}-${e.value[2].code}` this.showLocal = false },
九:數(shù)據(jù)的回填
//已經(jīng)知道了 this.local ='省-市-區(qū)'初始彈窗時默認(rèn)選中改值 backfill(temp) { temp = item.area.split('-') let index, index1, index2 = 0 let arr, arr1, arr2 = [] //匹配省市區(qū)對應(yīng)每列的第幾個 this.addressData.forEach((item, i) => { if (item.name == temp[0]) { index = i item.children.forEach((val, ind) => { if (val.name == temp[1]) { index1 = ind val.children.forEach((e, n) => { if (e.name == temp[2]) { index2 = n } }) } }) } }) arr = this.addressData.map(e => { return { name: e.name, code: e.code } }) arr1 = this.addressData[index].children.map(e => { return { name: e.name, code: e.code } }) arr2 = this.addressData[index].children[index1].children.map(e => { return { name: e.name, code: e.code } }) //反推出3列的數(shù)組數(shù)據(jù) this.addressColumns = [arr, arr1, arr2] // 賦值給 默認(rèn)初始選中 this.defaultAddress = [index, index1, index2] }
這是選中效果
這是其中的json文件
鏈接: https://pan.baidu.com/s/1q8Qr-4FRXdhlGP0JkU9MJg
提取碼: gwtr
總結(jié)
到此這篇關(guān)于Uni-App用uView組件庫中u-picker實(shí)現(xiàn)地區(qū)的省-市-區(qū)三級聯(lián)動、確認(rèn)及回顯的文章就介紹到這了,更多相關(guān)UniApp u-picker地區(qū)省市區(qū)三級聯(lián)動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
top.location.href 沒有權(quán)限 解決方法
以前好像沒有遇到這問題,也可能是沒有在意吧,我的blog內(nèi)容頁都是有判斷的,規(guī)則是,如果top.location不是內(nèi)容頁的話就跳到內(nèi)容頁2008-08-08javascript實(shí)現(xiàn)iframe框架延時加載的方法
這篇文章主要介紹了javascript實(shí)現(xiàn)iframe框架延時加載的方法,可基于setTimeout實(shí)現(xiàn)這一功能,是非常實(shí)用的技巧,需要的朋友可以參考下2014-10-10PHP使用方法重載實(shí)現(xiàn)動態(tài)創(chuàng)建屬性的get和set方法
這篇文章主要介紹了PHP使用方法重載實(shí)現(xiàn)動態(tài)創(chuàng)建屬性的get和set方法,使用本文方法可以在一個類中不用在寫大量的set方法或get方法,需要的朋友可以參考下2014-11-11js封裝成插件_Canvas統(tǒng)計圖插件編寫實(shí)例
下面小編就為大家?guī)硪黄猨s封裝成插件_Canvas統(tǒng)計圖插件編寫實(shí)例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Vant+postcss-pxtorem 實(shí)現(xiàn)瀏覽器適配功能
這篇文章主要介紹了Vant+postcss-pxtorem 實(shí)現(xiàn)瀏覽器適配,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02javascript中的altKey 和 Event屬性大全
本文給大家介紹javascript中的altkey和event屬性大全,涉及到altkey和event屬性語法定義及用法,本文介紹的非常詳細(xì),感興趣的朋友一起看看吧2015-11-11Bootstrap Table 在指定列中添加下拉框控件并獲取所選值
通過 bootstrap-table 的Column 配置項中的formatter,將獲取到的數(shù)據(jù)轉(zhuǎn)換為包含數(shù)據(jù)的 select 控件。然后根據(jù)用戶選擇項更新對應(yīng)單元格數(shù)據(jù),最后通過getallselection方法獲取所選行數(shù)據(jù)2017-07-07