小程序:底部弹起的滚动选择器(picker)

代码Github地址

一. 说明

从底部弹起的滚动选择器,现支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器。

1. 普通选择器:mode = selector
属性名 类型 默认值 说明
range Array / Object Array [] range是该选择器的选项内容。mode为 普通选择器 或 多列选择器 时,range有效。
range-key String 当 range 是一个 Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
value Number 0 表示选择了 range数组 中的第几个(下标从 0 开始)
bindchange EventHandle 滚动选中时触发 change 事件,event.detail = {value: value}
disabled Boolean false 是否禁用
bindcancel EventHandle 取消选择或点遮罩层收起 picker 时触发
// wxml
  <!-- 普通选择器 -->
  <view class="picker-container">
    <text>普通选择器(字符串数组数据):mode = selector</text>
    <picker class="picker" mode="selector" range="{{array}}" value="{{index}}" bindchange="bindPickerChange" bindcancel="cancel">
      <view class="picker">
        当前选择:{{array[index]}}
      </view>
    </picker>
  </view>

  <view class="picker-container">
    <text>普通选择器(对象数组数据):mode = selector</text>
    <picker class="picker" mode="selector" range="{{objectArray}}" range-key="name" value="{{index}}" bindchange="bindPickerChange">
      <view class="picker">
        当前选择:{{objectArray[index].name}}
      </view>
    </picker>
  </view>

// wxss
.picker-container {
  text-align: center;
  margin-top: 20px;
  background-color: yellow;
  font-size: 40rpx;
}

.picker {
  margin-left: 10%;
  margin-right: 10%;
  background-color: orange;
}

// js
  data: {
    // 普通选择器
    array: ['苹果', '橘子', '香蕉', '西红柿'],  // 字符串数组
    index: 1,  // 默认选中第几行
    objectArray: [    // 对象数组
      { id: 0, name: '苹果' },
      { id: 1, name: '橘子' },
      { id: 2, name: '香蕉' },
      { id: 3, name: '西红柿'}
    ],
 },

  bindPickerChange: function (event) {
    console.log('picker发送选择改变,携带值为', event.detail.value)
    this.setData({
      index: event.detail.value
    })
  },
  cancel: function (event) {
    console.log("取消了");
  },
2. 普通选择器:mode = multiSelector
属性名 类型 默认值 说明
range 二维Array / 二维Object Array [] mode为 selector 或 multiSelector 时,range 有效。二维数组,长度表示多少列,数组的每项表示每列的数据,如[["a","b"], ["c","d"]]
range-key String 当 range 是一个 二维Object Array 时,通过 range-key 来指定 Object 中 key 的值作为选择器显示内容
value Array [] value 每一项的值表示选择了 range 对应项中的第几个(下标从 0 开始)
bindchange EventHandle value 改变时触发 change 事件,event.detail = {value: value}
bindcolumnchange EventHandle 某一列的值改变时触发 columnchange 事件,event.detail = {column: column, value: value},column 的值表示改变了第几列(下标从0开始),value 的值表示变更值的下标
bindcancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用
// wxml
  <!-- 多列选择器 -->
  <view class="picker-container">
    <text>多列选择器(二维数组) :mode = multiSelector</text>
    <picker class="picker" mode="multiSelector" range="{{multiArray}}" value="{{multiIndex}}" bindchange="multiBindchange">
      <view class="picker">
        当前选择:{{multiArray[0][multiIndex[0]]}},{{multiArray[1][multiIndex[1]]}},{{multiArray[2][multiIndex[2]]}}
      </view>
    </picker>
  </view>

// wxss
.picker-container {
  text-align: center;
  margin-top: 20px;
  background-color: yellow;
  font-size: 40rpx;
}

.picker {
  margin-left: 10%;
  margin-right: 10%;
  background-color: orange;
}

// js
  data: {
    multiArray: [['无脊柱动物', '脊柱动物'], ['扁性动物', '线形动物', '环节动物', '软体动物', '节肢动物'], ['猪肉绦虫', '吸血虫']],
    multiIndex: [0, 1, 2],
  },
  multiBindchange: function (event) {
    console.log('picker发送选择改变,携带值为', event.detail.value)
    this.setData({
      multiIndex: [event.detail.value[0], event.detail.value[1], event.detail.value[2]]
    })
  },
  multiPickerColumnChange: function (e) {
    console.log('修改的列为', e.detail.column, ',值为', e.detail.value);
  },

3. 时间选择器:mode = time
属性名 类型 默认值 说明
value String 表示选中的时间,格式为"hh:mm"
start String 表示有效时间范围的开始,字符串格式为"hh:mm"
end String 表示有效时间范围的结束,字符串格式为"hh:mm"
bindchange EventHandle value 改变时触发 change 事件,event.detail = {value: value}
bindcancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用
// wxml
  <!-- 时间选择器 -->
  <view class="picker-container">
    <text>时间选择器:mode = time</text>
    <picker class="picker" mode="time" value="{{timeValue}}" start="{{start}}" end="{{end}}" bindchange="timeChange">
      <view class="picker">
        当前选择: {{timeValue}}
      </view>
    </picker>
  </view>

 // wxss
.picker-container {
  text-align: center;
  margin-top: 20px;
  background-color: yellow;
  font-size: 40rpx;
}

.picker {
  margin-left: 10%;
  margin-right: 10%;
  background-color: orange;
}

// js 
  data: {
    timeValue: "12:00",  // 选中的时间
    start: "00:00", // 开始时间
    end: "24:00",
  },

  timeChange: function (event) {
    let time = event.detail.value;

    console.log(event);
    this.setData({
      timeValue: time
    });
  },
4. 日期选择器:mode = date
属性名 类型 默认值 说明
value String 0 表示选中的日期,格式为"YYYY-MM-DD"
start String 表示有效日期范围的开始,字符串格式为"YYYY-MM-DD"
end String 表示有效日期范围的结束,字符串格式为"YYYY-MM-DD"
fields String day 有效值 year,month,day,表示选择器的粒度
bindchange EventHandle value 改变时触发 change 事件,event.detail = {value: value}
bindcancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用
// wxml
  <!-- 日期选择器 -->
  <view class="picker-container">
    <text>日期选择器:mode = date</text>
    <picker class="picker" fields="month" mode="date" value="{{dateValue}}" start="{{dateStart}}" end="{{dateEnd}}" bindchange="dateChange">
      <view class="picker">
        当前选择: {{dateValue}}
      </view>
    </picker>
  </view>

// js
.picker-container {
  text-align: center;
  margin-top: 20px;
  background-color: yellow;
  font-size: 40rpx;
}

.picker {
  margin-left: 10%;
  margin-right: 10%;
  background-color: orange;
}

// js 
data : {
    dateValue: "2018-06-21",   // 日期选中时间
    dateStart: "2018-01-01",   // 日期开始时间
    dateEnd: "2018-12-30",     // 日期结束时间
  },
  dateChange: function (event) {
    let date = event.detail.value;

    console.log(event);
    this.setData({
      dateValue: date
    });
  },
5. 地区选择器:mode = region
属性名 类型 默认值 说明
value Array [] 表示选中的省市区,默认选中每一列的第一个值
custom-item String 可为每一列的顶部添加一个自定义的项
bindchange EventHandle value 改变时触发 change 事件,event.detail = {value: value}
bindcancel EventHandle 取消选择时触发
disabled Boolean false 是否禁用
// wxml
  <!-- 省市区选择器 -->
  <view class="picker-container">
    <text>省市区选择器:mode = region</text>
    <picker class="picker" mode="region" value="{{regionValue}}" custom-item="{{custom}}" bindchange="regionChange">
      <view class="picker">
        当前选择: {{regionValue}}
      </view>
    </picker>
  </view>

// wxss
.picker-container {
  text-align: center;
  margin-top: 20px;
  background-color: yellow;
  font-size: 40rpx;
}

.picker {
  margin-left: 10%;
  margin-right: 10%;
  background-color: orange;
}

// js 
data : {
    regionValue: ["山东省","枣庄市","滕州市"],  // 默认选中,不填或者空,就默认第一个
    custom : "全部",
},

  regionChange: function (event) {
    let region = event.detail.value;

    console.log(event);
    this.setData({
      regionValue: region
    });
  },
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,445评论 25 707
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_x阅读 15,967评论 3 119
  • 参考周莫烦的视频课程 强化学习是非监督学习的例子 ,只给行为打分,机器自己想办法提高分数 机器自动学习避开低分区 ...
    重新出发_砥砺前行阅读 689评论 0 0
  • 文/冰雨璇韵 2018年3月3日 星期六 晴 我从来都是一个很注重仪式感的人,不论在学习上,还是生活里。 曾经与三...
    冰雨璇韵阅读 593评论 0 7
  • 这段时间很火的一步动画电影《寻梦环游记》,它的英文名是《Coco》,估计很多人已经看过这部电影了,在被朋友...
    幽兰茶屋阅读 259评论 0 1