uni-app之picker

從底部彈起的滾動選擇器。支持五種選擇器宏侍,通過mode來區(qū)分赖淤,分別是普通選擇器,多列選擇器谅河,時間選擇器咱旱,日期選擇器确丢,省市區(qū)選擇器,默認(rèn)是普通選擇器吐限。

1鲜侥、普通選擇器
mode = selector

屬性說明

屬性名 類型 默認(rèn)值 說明
range Array / Array<Object> [] mode為 selector 或 multiSelector 時,range 有效
range-key String 當(dāng) range 是一個 Array<Object> 時毯盈,通過 range-key 來指定 Object 中 key 的值作為選擇器顯示內(nèi)容
value Number 0 value 的值表示選擇了 range 中的第幾個(下標(biāo)從 0 開始)
@change EventHandle value 改變時觸發(fā) change 事件剃毒,event.detail = {value: value}
disabled Boolean false 是否禁用
@cancel EventHandle 取消選擇或點(diǎn)遮罩層收起 picker 時觸發(fā)
  • picker在各平臺的實(shí)現(xiàn)是有UI差異的,有的平臺如百度搂赋、支付寶小程序的Android端是從中間彈出的赘阀;有的平臺支持循環(huán)滾動如微信、百度小程序脑奠;有的平臺沒有取消按鈕如App端基公。但均不影響功能使用。

2宋欺、多列選擇器
mode = multiSelector

平臺差異說明

App H5 微信小程序 支付寶小程序 百度小程序 字節(jié)跳動小程序 QQ小程序
vue支持轰豆,nvue自2.4起支持 x

支付寶小程序 picker 組件不支持多列選擇,可以使用 picker-view 組件替代齿诞。

屬性說明

屬性名 類型 默認(rèn)值 說明
range 二維 Array / 二維 Array<Object> [] mode為 selector 或 multiSelector 時酸休,range 有效。二維數(shù)組祷杈,長度表示多少列斑司,數(shù)組的每項(xiàng)表示每列的數(shù)據(jù),如[["a","b"], ["c","d"]]
range-key String 當(dāng) range 是一個二維 Array<Object> 時但汞,通過 range-key 來指定 Object 中 key 的值作為選擇器顯示內(nèi)容
value Array [] value 每一項(xiàng)的值表示選擇了 range 對應(yīng)項(xiàng)中的第幾個(下標(biāo)從 0 開始)
@change EventHandle value 改變時觸發(fā) change 事件宿刮,event.detail = {value: value}
@columnchange EventHandle 某一列的值改變時觸發(fā) columnchange 事件,event.detail = {column: column, value: value}私蕾,column 的值表示改變了第幾列(下標(biāo)從0開始)僵缺,value 的值表示變更值的下標(biāo)
@cancel EventHandle 取消選擇時觸發(fā)
disabled Boolean false 是否禁用

bug & tips

  • 由于 JavaScript 的限制 vue 不能觀測如下方式設(shè)置 value:this.value[0] = 0vue 注意事項(xiàng)),解決方式參考:hello-uniapp 示例
  • 微信開發(fā)工具的pc模擬器有可能出現(xiàn)拖動數(shù)據(jù)錯亂踩叭,使用真機(jī)正常

3磕潮、時間選擇器
mode = time

平臺差異說明

App H5 微信小程序 支付寶小程序 百度小程序 字節(jié)跳動小程序 QQ小程序
  • 時間選擇在App端調(diào)用的是os的原生時間選擇控件,在不同平臺有不同的ui表現(xiàn)

屬性說明

屬性名 類型 默認(rèn)值 說明 平臺差異說明
value String 表示選中的時間容贝,格式為"hh:mm"
start String 表示有效時間范圍的開始自脯,字符串格式為"hh:mm" App 不支持
end String 表示有效時間范圍的結(jié)束,字符串格式為"hh:mm" App 不支持
@change EventHandle value 改變時觸發(fā) change 事件嗤疯,event.detail = {value: value}
@cancel EventHandle 取消選擇時觸發(fā)
disabled Boolean false 是否禁用

4冤今、日期選擇器
mode = date

平臺差異說明

App H5 微信小程序 支付寶小程序 百度小程序 字節(jié)跳動小程序 QQ小程序
  • 日期選擇在App端調(diào)用的是os的原生日期選擇控件闺兢,在不同平臺有不同的ui表現(xiàn)茂缚。

屬性說明

屬性名 類型 默認(rèn)值 說明 平臺差異說明
value String 0 表示選中的日期戏罢,格式為"YYYY-MM-DD"
start String 表示有效日期范圍的開始,字符串格式為"YYYY-MM-DD"
end String 表示有效日期范圍的結(jié)束脚囊,字符串格式為"YYYY-MM-DD"
fields String day 有效值 year,month,day龟糕,表示選擇器的粒度 H5、App 2.6.3+悔耘、微信小程序讲岁、百度小程序、字節(jié)跳動小程序
@change EventHandle value 改變時觸發(fā) change 事件衬以,event.detail = {value: value}
@cancel EventHandle 取消選擇時觸發(fā)
disabled Boolean false 是否禁用

fields 有效值

說明
year 選擇器粒度為年
month 選擇器粒度為月份
day 選擇器粒度為天

5缓艳、省市區(qū)選擇器
mode = region

平臺差異說明

App H5 微信小程序 支付寶小程序 百度小程序 字節(jié)跳動小程序 QQ小程序
x x x
  • 因省市區(qū)選擇器包含大量數(shù)據(jù),占用體積看峻,并非所有應(yīng)用都需要阶淘,且很多城市數(shù)據(jù)有自維護(hù)需求,所以在App和H5平臺沒有內(nèi)置互妓∠希可以基于多列picker或picker-view,自行填充城市數(shù)據(jù)冯勉,插件市場有較多類似插件澈蚌,詳見。注意基于多列picker方式的地區(qū)選擇不能運(yùn)行在支付寶小程序上灼狰,只有基于picker-view的可以全端運(yùn)行宛瞄。這些插件中,比較推薦的是SimpleJalon的地址聯(lián)動選擇插件伏嗜,它可以同時兼容app-nvue坛悉、app-vue、h5承绸、及各端小程序裸影。
屬性名 類型 默認(rèn)值 說明
value Array [] 表示選中的省市區(qū),默認(rèn)選中每一列的第一個值
custom-item String 可為每一列的頂部添加一個自定義的項(xiàng)
@change EventHandle value 改變時觸發(fā) change 事件军熏,event.detail = {value: value}
@cancel EventHandle 取消選擇時觸發(fā)
disabled Boolean false 是否禁用

示例 查看演示

以下示例代碼轩猩,來自于hello uni-app項(xiàng)目,推薦使用HBuilderX荡澎,新建uni-app項(xiàng)目均践,選擇hello uni-app模板,可直接體驗(yàn)完整示例摩幔。

<!-- 本示例未包含完整css彤委,獲取外鏈css請參考上文,在hello uni-app項(xiàng)目中查看 -->
<template>
    <view>
        <view class="uni-title uni-common-pl">地區(qū)選擇器</view>
        <view class="uni-list">
            <view class="uni-list-cell">
                <view class="uni-list-cell-left">
                    當(dāng)前選擇
                </view>
                <view class="uni-list-cell-db">
                    <picker @change="bindPickerChange" :value="index" :range="array">
                        <view class="uni-input">{{array[index]}}</view>
                    </picker>
                </view>
            </view>
        </view>

        <view class="uni-title uni-common-pl">時間選擇器</view>
        <view class="uni-list">
            <view class="uni-list-cell">
                <view class="uni-list-cell-left">
                    當(dāng)前選擇
                </view>
                <view class="uni-list-cell-db">
                    <picker mode="time" :value="time" start="09:01" end="21:01" @change="bindTimeChange">
                        <view class="uni-input">{{time}}</view>
                    </picker>
                </view>
            </view>
        </view>

        <view class="uni-title uni-common-pl">日期選擇器</view>
        <view class="uni-list">
            <view class="uni-list-cell">
                <view class="uni-list-cell-left">
                    當(dāng)前選擇
                </view>
                <view class="uni-list-cell-db">
                    <picker mode="date" :value="date" :start="startDate" :end="endDate" @change="bindDateChange">
                        <view class="uni-input">{{date}}</view>
                    </picker>
                </view>
            </view>
        </view>
    </view>
</template>


export default {
    data() {
        const currentDate = this.getDate({
            format: true
        })
        return {
            title: 'picker',
            array: ['中國', '美國', '巴西', '日本'],
            index: 0,
            date: currentDate,
            time: '12:01'
        }
    },
    computed: {
        startDate() {
            return this.getDate('start');
        },
        endDate() {
            return this.getDate('end');
        }
    },
    methods: {
        bindPickerChange: function(e) {
            console.log('picker發(fā)送選擇改變,攜帶值為', e.target.value)
            this.index = e.target.value
        },
        bindDateChange: function(e) {
            this.date = e.target.value
        },
        bindTimeChange: function(e) {
            this.time = e.target.value
        },
        getDate(type) {
            const date = new Date();
            let year = date.getFullYear();
            let month = date.getMonth() + 1;
            let day = date.getDate();

            if (type === 'start') {
                year = year - 60;
            } else if (type === 'end') {
                year = year + 2;
            }
            month = month > 9 ? month : '0' + month;;
            day = day > 9 ? day : '0' + day;
            return `${year}-${month}-${day}`;
        }
    }
}

示例代碼說明:以上示例代碼從hello uni-app示例中復(fù)制甚脉,涉及的css樣式在hello uni-app的app.vue和uni.css中

預(yù)覽H5效果:使用瀏覽器的手機(jī)模式訪問https://hellouniapp.dcloud.net.cn/pages/component/picker/picker

//自己寫的實(shí)例
//注意:省市區(qū)的值海雪,要 {{ cityVal[0] }},{{ cityVal[1] }},{{ cityVal[2] }} 分開寫
<view class="cu-form-group margin-top">
  <view class="title">所在地區(qū):</view>
  <picker mode="region" @change="cityChange" :value="cityVal">
    <view class="picker" v-if="cityVal.length>0">
      {{ cityVal[0] }},{{ cityVal[1] }},{{ cityVal[2] }}
    </view>
    <view class="picker text-gray" v-else>請選擇</view>
  </picker>
</view>


<script>
    export default {
        data() {
            return {
                cityVal: [] //所在地區(qū)
            }
        },
        methods: {
            cityChange(e) { ////////////////////////////////////省市區(qū)
                this.cityVal = e.detail.value;
            }
        }
    }
</script>

效果圖


選擇地區(qū)

6迈喉、注意

  • 在picker內(nèi)容還在滾動時或滾動回彈動畫還未結(jié)束時涣狗,點(diǎn)確定關(guān)閉彈出的picker们何,數(shù)據(jù)無法及時更新惭婿。需等待一下箕昭,或手動觸停滾動再點(diǎn)確定彬呻。所有平臺均如此
  • 如果需要在PC端使用picker衣陶,需注意pc端沒有touchmove事件,可以配置H5模版闸氮,并引入touch-emulator.js來解決剪况。hello uni-app的pc版也是使用了這個方案。

7蒲跨、實(shí)例
7-1拯欧、普通的數(shù)據(jù)綁定

//頁面
<view class="cu-form-group margin-top">
  <view class="title">普通選擇</view>
  <picker @change="PickerChange" :value="index" :range="picker">
    <view class="picker">{{index>-1?picker[index]:'禁止換行,超出容器部分會以 ... 方式截?cái)?}}</view>
  </picker>
</view>

//js
export default {
  data() {
    return {
      index: -1,
      picker: ['喵喵喵', '汪汪汪', '哼唧哼唧']
    }
  },
  methods: {
    PickerChange(e) {
      this.index = e.detail.value
    }
  }
}

7-2财骨、動態(tài)綁定數(shù)據(jù)

//頁面
<view class="cu-form-group margin-top">
  <view class="title">班級列表</view>
  <picker :value="classIndex" :range-key="'FClassName'" :range="classList" @change="classListPChange">
      <view class="picker">{{ classList[classIndex].FClassName }}</view>
  </picker>
</view>

//js
export default {
  data() {
    return {
      classIndex: 0, //班級列表 -- 默認(rèn)顯示第一個班級的下標(biāo)
      classID: 0, //班級列表 -- 某班級ID
      classList: [{'FID':56,'FClassName':'一年級1班'},{'FID':57,'FClassName':'二年級2班'},{'FID':58,'FClassName':'三年級3班'}]
    }
  },
  methods: {
    classListPChange(e) {
      var thisIndex = e.detail.value;
      this.classID = classList[thisIndex].FID;
      this.classIndex = thisIndex;
    }
  }
}

:range-key="'FClassName'"镐作,F(xiàn)ClassName要加單引號

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市隆箩,隨后出現(xiàn)的幾起案子该贾,更是在濱河造成了極大的恐慌,老刑警劉巖捌臊,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杨蛋,死亡現(xiàn)場離奇詭異,居然都是意外死亡理澎,警方通過查閱死者的電腦和手機(jī)逞力,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糠爬,“玉大人寇荧,你說我怎么就攤上這事≈此恚” “怎么了揩抡?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長镀琉。 經(jīng)常有香客問我峦嗤,道長,這世上最難降的妖魔是什么屋摔? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任烁设,我火速辦了婚禮,結(jié)果婚禮上钓试,老公的妹妹穿的比我還像新娘装黑。我一直安慰自己耙替,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布曹体。 她就那樣靜靜地躺著,像睡著了一般硝烂。 火紅的嫁衣襯著肌膚如雪箕别。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天滞谢,我揣著相機(jī)與錄音串稀,去河邊找鬼。 笑死狮杨,一個胖子當(dāng)著我的面吹牛母截,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播橄教,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼清寇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了护蝶?” 一聲冷哼從身側(cè)響起华烟,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎持灰,沒想到半個月后盔夜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡堤魁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年喂链,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妥泉。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡椭微,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盲链,到底是詐尸還是另有隱情赏表,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布匈仗,位于F島的核電站瓢剿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悠轩。R本人自食惡果不足惜间狂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望火架。 院中可真熱鬧鉴象,春花似錦忙菠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淆游,卻和暖如春傍睹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背犹菱。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工拾稳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腊脱。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓访得,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陕凹。 傳聞我的和親對象是個殘疾皇子悍抑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355