Uni-App用uView組件庫中u-picker實(shí)現(xiàn)地區(qū)的省-市-區(qū)三級(jí)聯(lián)動(dòng)、確認(rèn)及回顯

一:準(zhǔn)備工作
組件的引入就不多贅述了 直接看使用方法
二:json文件數(shù)據(jù)
地址我是引入的json文件數(shù)據(jù)結(jié)構(gòu)大概是這個(gè)樣子
例1

例2

三:先做個(gè)按鈕做彈窗顯示
做個(gè)動(dòng)態(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="請(qǐng)選擇所在地"
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: '', //這個(gè)變量看個(gè)人需求使用
showLocal: false, //是否展示彈出層
addressColumns: [], //數(shù)據(jù)數(shù)組
defaultAddress: [], //默認(rèn)選中 (回填時(shí)或者初次顯示默認(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所以才用對(duì)象包起來的 下面的市 區(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個(gè)數(shù)組 的第一個(gè)市的所有數(shù)據(jù)賦值 作為初始數(shù)據(jù)
},
七:數(shù)據(jù)變更時(shí)的方法

changeHandler(e) {
//分別表示選中的列 , 該列的第幾個(gè),選中的3列的第幾個(gè)的數(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)時(shí)的方法

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ū)'初始彈窗時(shí)默認(rèn)選中改值
backfill(temp) {
temp = item.area.split('-')
let index,
index1,
index2 = 0
let arr,
arr1,
arr2 = []
//匹配省市區(qū)對(duì)應(yīng)每列的第幾個(gè)
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ū)三級(jí)聯(lián)動(dòng)、確認(rèn)及回顯的文章就介紹到這了,更多相關(guān)UniApp u-picker地區(qū)省市區(qū)三級(jí)聯(lián)動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript無刷新評(píng)論實(shí)現(xiàn)方法
這篇文章主要介紹了javascript無刷新評(píng)論實(shí)現(xiàn)方法,涉及javascript動(dòng)態(tài)添加表格元素的技巧,需要的朋友可以參考下2015-05-05
JavaScript版經(jīng)典游戲之掃雷游戲完整示例【附demo源碼下載】
這篇文章主要介紹了JavaScript版經(jīng)典游戲之掃雷游戲?qū)崿F(xiàn)方法,結(jié)合完整實(shí)例形式分析了掃雷游戲的原理與具體實(shí)現(xiàn)流程,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-12-12
js鼠標(biāo)坐標(biāo)獲取常用的三個(gè)方法
這篇文章主要給大家介紹了js鼠標(biāo)坐標(biāo)獲取常用的三個(gè)方法,在 JavaScript中當(dāng)事件發(fā)生時(shí)獲取鼠標(biāo)的位置是件很重要的事件,需要的朋友可以參考下2023-09-09
Mozilla 表達(dá)式 __noSuchMethod__
這是一個(gè)很特殊的方法,但是其存在的意義很大。不過很可惜只有firefox支持了。一個(gè)簡單的例子解釋一下它的用處2009-04-04
javascript事件函數(shù)中獲得事件源的兩種不錯(cuò)方法
許多情況我們需要獲得事件源對(duì)象來對(duì)其屬性進(jìn)行更改,在事件響應(yīng)函數(shù)中獲得事件源的方法有如下兩種2014-03-03
Bootstrap Tooltip顯示換行和左對(duì)齊的解決方案
小編在使用Bootstrap的Tooltip功能時(shí)遇到一些小問題,換行丟失,文字不是左對(duì)齊。下面小編給大家介紹下Bootstrap Tooltip顯示換行和左對(duì)齊的解決方案,感興趣的朋友一起看看吧2017-10-10
javascript限制文本框只允許輸入數(shù)字(曾經(jīng)與現(xiàn)在的方法對(duì)比)
很多時(shí)候需要用到限制文本框的數(shù)字輸入,試過許多方法,都不太理想,遂決定自己實(shí)現(xiàn)一個(gè)來玩玩,接下來介紹曾經(jīng)使用過的方法與自定義方法的對(duì)比,感興趣的朋友可以了解下啊2013-01-01
js實(shí)現(xiàn)超酷的照片墻展示效果圖附源碼下載
這篇文章主要介紹了超酷的照片墻展示效果圖附源碼下載的相關(guān)資料,需要的朋友可以參考下2015-10-10

