uniapp中使用picker-view选择时间

picker-view 是 UniApp 中用于展示和选择数据的组件。它适用于创建多列选择器,类似于 iOS 和 Android 系统中的选择器视图。以下是 picker-view 的详细介绍,包括用法、属性和事件。
在这里插入图片描述

一 用法

<template>
  <view>
    <picker-view :value="value" @change="onChange" :indicator-style="indicatorStyle">
      <picker-view-column v-for="(column, index) in columns" :key="index">
        <view v-for="(item, itemIndex) in column" :key="itemIndex">{
  
  { item }}</view>
      </picker-view-column>
    </picker-view>
  </view>
</template>
<script>
export default {
   
   
  data() {
   
   
    return {
   
   
      value: [0, 0], // 选中的值对应列中的索引
      columns: [     // 列数据
        ['Option 1', 'Option 2', 'Option 3'],
        ['Item 1', 'Item 2', 'Item 3']
      ],
      indicatorStyle: 'height: 50px; line-height: 50px;' // 指示器样式
    };
  },
  methods: {
   
   
    onChange(e) {
   
   
      this.value = e.detail.value; // 更新选中的值
      console.log('Selected value:', this.value);
    }
  }
};
</script>
<style scoped>
/* 可以根据需要添加自定义样式 */
</style>

二 主要属性

  • value: 数组,表示当前选中的索引值。数组的长度应与 columns 的列数一致。例如,如果有两列,每列的选项数组长度分别为 3 和
    3,则 value 应该是 [0, 0] 表示两列的默认选中项索引。
  • indicator-style: 字符串,用于设置选择器的指示器样式。可以设置如高度、背景颜色等样式。

三 主要事件

change: 当用户选择了新项时触发。事件对象的 detail.value 是更新后的选中值数组。例如:

onChange(e) {
   
   
  this.value = e.detail.value;
  console.log('Selected value:', this.value);
}
  • picker-view-column 是 picker-view 的子组件,每个 picker-view-column 代表一个列。
  • v-for 指令用于遍历 columns 和列中的选项数据。
  • e.detail.value 是一个数组,表示用户选择的每一列的索引。

四 应用场景

  • 选择日期和时间
  • 选择地区(省市区)
  • 多级分类选择

五 案例

需求 :购买商品时,可以选择取货时间,点击向右的箭头可以显示选择预约取货时间弹窗。第一次进入弹窗,默认回显当前时间,选择时间后,回显选择的时间
父组件在打开弹框时,会传一个当前时间给子组件,子组件在初始化时,根据当前时间进行回显。
在这里插入图片描述

根据传过来的时间,拿到月,时,分,然后分别在days,hours,minutes中找到对应的index,在分别把index push到value中
在这里插入图片描述

  let dayIndex = this.days.findIndex((item) => item === objTimeDay);
            let hourIndex = this.hours.findIndex((item) => item === objTimeHour);
            let minuteIndex = this.minutes.findIndex((item) => item === objTimeMinute);
            if (dayIndex > -1) {
   
   
                this.value[0] = dayIndex;
            }
            if (hourIndex > -1) {
   
   
                this.value[1] = hourIndex;
            }
            if (minuteIndex > -1) {
   
   
                this.value[2] = minuteIndex;
            }

在这里插入图片描述
在这里插入图片描述

完整代码
父组件

// 引用
import selectTime from './selectTime/index.vue';
//注册
 components: {
   
    selectAddress, selectShop, selectTime },
//使用
 <select-time ref="selectTime" @getSelectTime="getSelectTime"></select-time>

openSelectTimePopup() {
   
   
            this.$refs.
### UniApp 中自定义 Picker-View 的实现 #### 创建基础结构 为了创建一个功能丰富的 `picker-view` 组件,在项目中新建文件夹用于存放该组件的相关资源。通常情况下,这涉及到 HTML 结构的设计以及样式调整。 ```html <template> <view class="custom-picker"> <!-- 显示当前选中的值 --> <text>{{ selectedValue }}</text> <!-- PickerView 组件 --> <picker-view indicator-style="height: 50px;" :value="index" @change="bindChange"> <picker-view-column v-for="(column, columnIndex) in columns" :key="columnIndex"> <div v-for="(item, index) in column" :key="index">{{ item.label }}</div> </picker-view-column> </picker-view> <!-- 如果需要可以加入popup或其他形式触发器来显示PickerView --> </view> </template> ``` #### 数据准备与逻辑处理 在 Vue.js 或者 TypeScript 文件里准备好数据源并编写相应的方法来进行交互操作[^1]。 ```typescript <script lang="ts"> import { defineComponent } from 'vue'; export default defineComponent({ data() { return { // 初始化索引数组,默认指向每一列的第一个选项 index: [0], // 多维数组保存各列的数据项 columns: [ [{ label: "2023", value: 2023 }, ...], [{ label: "Jan", value: 1 }, ...] ], // 当前选择的结果 selectedValue: '' }; }, methods: { bindChange(e:any){ const val = e.detail.value; this.index = val; let result = ''; for(let i=0;i<this.columns.length;i++){ result += `${this.columns[i][val[i]].label} `; } this.selectedValue = result.trim(); } } }); </script> ``` #### 样式美化 通过 CSS 来增强用户体验,比如设置字体大小、颜色等属性使界面更加友好美观[^4]。 ```css <style scoped> .custom-picker text{ font-size: large; } .picker-view div{ line-height: 50px; } </style> ``` 上述代码片段展示了如何构建一个简单的多列 `picker-view` 控件,并实现了基本的选择事件监听和数据显示更新的功能。对于更复杂的应用场景,则可能还需要考虑更多细节上的定制化需求,例如不同平台间的适配差异等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

x-z-y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值