微信小程序之时间选择器(包含年,月,日。时,分,秒)自定义组件

一、建立组件
/components/timePicker/index在这里插入图片描述
index.js

// components/timePicker/index.js
Component({
    /**
     * 组件的属性列表
     */
    properties: {
        /**
         * 组件类型 date:日期(yyyy-MM-dd) time:时间(hh:mm:ss) dateTime: 日期时间(yyyy-MM-dd hh:mm:ss)
         */
        mode: {
            type: String,
            value: 'date',
            observer: 'modeChange'
        },
        disabled: {
            type: Boolean,
            value: false
        },
        placeholder: String
    },

    /**
     * 组件的初始数据
     */
    data: {
        pickerArray: [], //日期控件数据list
        pickerIndex: [], //日期控件选择的index
        dateString: '' //页面显示日期
    },

    /**
     * 组件的方法列表
     */
    methods: {

        modeChange: function (newVal, oldVal) {
            this.getPickerArray(newVal)
        },
        //补零
        formatNumber(n) {
            n = n.toString()
            return n[1] ? n : '0' + n
        },
        //日期时间格式化
        formateDateTime(arr) {
            let mode = this.data.mode
            switch (mode) {
                case 'date':
                    return arr.map(this.formatNumber).join('-')
                    break;
                case 'time':
                    return arr.map(this.formatNumber).join(':')
                    break;

                case 'dateTime':
                    return arr.slice(0, 3).map(this.formatNumber).join('-') + ' ' + arr.slice(3, 6).map(this.formatNumber).join(':')
                    break;
            }
        },

        /**
         *
         * 获取本月天数
         * @param {number} year
         * @param {number} month
         * @param {number} [day=0] 0为本月0最后一天的
         * @returns number 1-31
         */
        _getNumOfDays(year, month, day = 0) {
            return new Date(year, month, day).getDate();
        },

        //获取pickerArray
        getPickerArray(mode = this.data.mode) {
            let date = new Date();
            let pickerArray = []
            //年
            let year = [];
            for (let i = date.getFullYear() - 5; i <= date.getFullYear() + 5; i++) {
                year.push({
                    id: i,
                    name: i + '年'
                });
            }
            let currentYear = date.getFullYear();
            let yearIndex = year.findIndex(item => item.id == currentYear);
            pickerArray.push({
                picker: 'year',
                value: year,
                pickerIndex: yearIndex
            })
            //月
            let month = [];
            for (let i = 1; i <= 12; i++) {
                month.push({
                    id: i,
                    name: i + '月'
                });
            }
            pickerArray.push({
                picker: 'month',
                value: month,
                pickerIndex: date.getMonth(),
            })
            //日
            let dayNum = this._getNumOfDays(date.getFullYear(), date.getMonth() + 1);
            let day = [];
            for (let i = 1; i <= dayNum; i++) {
                day.push({
                    id: i,
                    name: i + '日'
                });
            }
            pickerArray.push({
                picker: 'day',
                value: day,
                pickerIndex: date.getDate() - 1,
            })
            //时
            let time = [];
            for (let i = 0; i <= 23; i++) {
                time.push({
                    id: i,
                    name: this.formatNumber(i)
                });
            }
            pickerArray.push({
                picker: 'time',
                value: time,
                pickerIndex: date.getHours(),
            })
            //分
            let minutes = [];
            for (let i = 0; i <= 59; i++) {
                minutes.push({
                    id: i,
                    name: this.formatNumber(i)
                });
            }
            pickerArray.push({
                picker: 'minutes',
                value: minutes,
                pickerIndex: date.getMinutes(),
            })
            //秒
            let seconds = [];
            for (let i = 0; i <= 59; i++) {
                seconds.push({
                    id: i,
                    name: this.formatNumber(i)
                });
            }
            pickerArray.push({
                picker: 'seconds',
                value: seconds,
                pickerIndex: date.getSeconds(),
            })

            let pickerIndex = []
            //过滤不同mode的pickerArray keys
            let formatPickerArray = () => {
                switch (mode) {
                    case 'date':
                        return ['year', 'month', 'day']
                        break;
                    case 'dateTime':
                        return ['year', 'month', 'day', 'time', 'minutes', 'seconds']
                        break;
                    case 'time':
                        return ['time', 'minutes', 'seconds']
                        break;
                }
            }
            //过滤不同mode的pickerArray values
            let pickerValues = formatPickerArray(mode)
            let formatPickers = []
            // pickerArray.filter(item =>
            //     pickerValues.indexOf(item.picker) >= 0
            // )
            //获取pickers选项和默认选择下标
            pickerArray.map(item => {
                if (pickerValues.indexOf(item.picker) >= 0) {
                    pickerIndex.push(item.pickerIndex)
                    formatPickers.push(item.value)
                }
            })
            this.setData({
                pickerArray: formatPickers,
                pickerIndex
            })
            //通过下标获取对应时间
            let currentDate = this.getPickerValue(pickerIndex)
            this.setData({
                dateString: currentDate
            })

        },

        getPickerValue(pickerIndex) {
            let date = this.data.pickerArray.map((item, index) =>
                // console.log(this.data.pickerArray[index][pickerIndex[index]].id, pickerIndex)
                this.data.pickerArray[index][pickerIndex[index]].id
            )
            let dateString = this.formateDateTime(date)

            return dateString
        },
        pickerChange: function (e) {
            let currentDate = this.getPickerValue(e.detail.value)
            this.setData({
                dateString: currentDate
            })
            let detail = {
                value: currentDate
            }
            this.triggerEvent('onPickerChange', detail);
        },
        //月变化时获取当月多少天
        pickerColumnChange: function (e) {
            let value = e.detail
            let year = this.data.pickerArray[0][this.data.pickerIndex[0]].id
            if (this.data.mode !== 'time') {
                if (value.column === 1) {
                    let days = this._getNumOfDays(year, value.value + 1)
                    let day = [];
                    for (let i = 1; i <= days; i++) {
                        day.push({
                            id: i,
                            name: i + '日'
                        });
                    }
                    this.data.pickerArray[2] = day
                    this.setData({
                        pickerArray: this.data.pickerArray
                    })
                }
            }
        },
        pickerCancel: function (e) {}

    },

    lifetimes: {
        attached() {
            // 在组件实例进入页面节点树时执行
        },
        detached() {
            // 在组件实例被从页面节点树移除时执行
        },
        ready() {
            this.getPickerArray()
        }
    }
});

index.json

{
  "component": true,
  "usingComponents": {}
}

index.wxml

<!-- components/timePicker/index.wxml -->
<view>
  <picker disabled="{{disabled}}" mode="multiSelector" bindchange="pickerChange" bindcolumnchange="pickerColumnChange"
    bindcancel="pickerCancel" value="{{pickerIndex}}" range="{{pickerArray}}" range-key="{{'name'}}">
    <view>
      <input placeholder="{{placeholder}}" class="weui-input" disabled="{{true}}" value="{{dateString}}"></input>
    </view>
  </picker>
</view>

index.wss

/* components/timePicker/index.wxss */

.input_base {
    border: 2rpx solid #ccc;
    padding-left: 10rpx;
    margin-right: 50rpx;
}

.input_h30 {
    height: 30px;
    line-height: 30px;
}

.col-1 {
    -webkit-box-flex: 1;
    box-flex: 1;
}

二、引用
/pages/index

index.json

{
    "usingComponents": {
        "time-picker": "../../../components/timePicker/index"
    }
}

index.wxml

<!-- index.wxml -->
<view class="title">时间选择</view>
<radio-group class="radio-group" bindchange="radioChange">
  <label class="radio" wx:for="{{items}}" wx:key="{{index}}">
    <radio value="{{item.value}}" checked="{{item.checked}}" />
    {{item.name}}
  </label>
</radio-group>
<time-picker mode="{{mode}}" class="picker" placeholder="请选择时间" bind:onPickerChange="onPickerChange"></time-picker>

index.js

//index.js
//获取应用实例
const app = getApp()

Page({
    data: {
        items: [{ name: '日期选择', value: 'date', checked: 'true' }, { name: '时间选择', value: 'time' }, { name: '日期时间选择', value: 'dateTime' }],
        mode: 'date'
    },
    onPickerChange(e) {//返回回调函数
        console.log("onPickerChange", e)
    },
    radioChange: function(e) {
        console.log(e)
        this.setData({
            mode: e.detail.value//获取类型;date年月日;time时分秒;dateTime年月日+时分秒
        })
    },
    onLoad: function() {

    },
})

三、效果
mode为date时
在这里插入图片描述
mode为time时在这里插入图片描述
mode为dateTime时
在这里插入图片描述

<think>嗯,用户想了解Excel中的VLOOKUP函数的用法参数含义。首先,我需要回忆一下VLOOKUP的基本结构。VLOOKUP是垂直查找函数,用于在表格的首列查找指定的值,然后返回该行中指定列的数据。它的四个参数别是查找值、表格范围、列索引号匹配模式。 接下来,我得确认每个参数的具体作用。第一个参数是lookup_value,也就是用户要查找的值,比如产品ID或者姓名。第二个参数是table_array,即查找的范围,这里要注意的是,查找值必须位于这个范围的第一列,否则函数无法正确工作。第三个参数是col_index_num,也就是用户想要返回的数据在表格范围中的第几列,这个列数是从表格范围的第一列开始算起的,不是整个工作表的列。第四个参数是range_lookup,决定是精确匹配还是近似匹配,通常用FALSE或0来指定精确匹配,避免错误。 然后,用户可能需要一个具体的例子来理解如何使用。比如,假设有一个产品价格表,用户想根据产品ID查找对应的价格。这候,VLOOKUP就可以在ID列查找,然后返回价格列的数据。同,要提醒用户注意表格范围最好使用绝对引用,比如$A$2:$C$100,这样在拖动公式范围不会变化。 可能遇到的问题也需要考虑。比如,如果查找值不在表格的第一列,或者列索引号超过了表格的列数,函数会返回错误。此外,数据格式不一致也可能导致问题,比如查找值是数字,而表格中是文本格式的数字,这候需要统一格式。还有,当出现#N/A错误,可能是查找值不存在,或者匹配模式设置不正确,需要检查参数是否正确。 用户可能还会问到如何避免常见的错误,比如部数据匹配出错的情况。这候需要检查是否有多余的空格,或者数据格式不一致,或者表格范围没有锁定导致拖动偏移。此外,XLOOKUP作为VLOOKUP的升级版,可能在某些情况下更方便,比如可以向左查找或者返回多列数据,这也是可以提及的内容。 最后,整理步骤,从基础语法到参数说明,再到具体案例,逐步引导用户理解如何使用VLOOKUP函数。同,提供常见错误解决方法,帮助用户在实际应用中避免问题。如果有必要,还可以比较VLOOKUP其他查找函数的区别,比如HLOOKUP或XLOOKUP,但根据用户的问题,主要集中在VLOOKUP本身即可。</think>### Excel VLOOKUP函数详解 #### 一、基础语法与参数说明 VLOOKUP函数的语法为: $$=VLOOKUP(lookup\_value, table\_array, col\_index\_num, [range\_lookup])$$ 包含4个参数: 1. **lookup_value**(必填):要查找的值(如单元格引用或具体值) 2. **table_array**(必填):包含数据的表格范围(必须包含查找列返回列) 3. **col_index_num**(必填):返回值所在列的序号(从table_array第一列开始计数) 4. **range_lookup**(可选):匹配类型 - `TRUE`/`1`:近似匹配(默认值,需数据升序排列) - `FALSE`/`0`:精确匹配(常用选项) [^1][^2] #### 二、使用步骤演示(工资表查询案例) 假设需要根据员工编号查询工资: 1. 建立查询单元格(如`B12`) 2. 输入公式: ```excel =VLOOKUP(A12, $A$2:$D$100, 4, 0) ``` - `A12`:待查询的员工编号 - `$A$2:$D$100`:锁定数据区域(绝对引用) - `4`:返回第4列(工资列) - `0`:精确匹配 [^2][^3] #### 三、常见错误与解决方法 | 错误现象 | 原因 | 解决方案 | |---------|------|---------| | #N/A | 查找值不存在 | 检查数据源或改用`IFERROR`容错 | | #REF! | 列序号超出范围 | 确认col_index_num ≤ 表格列数 | | 部匹配失败 | 数据格式不一致 | 统一数值/文本格式 | | 结果错位 | 表格未锁定 | 使用`$`符号固定区域引用 | [^3][^4] #### 四、进阶技巧 1. **多条件查询**: 使用辅助列合并多个条件字段 ```excel =VLOOKUP(A2&B2, $D$2:$F$100, 3, 0) ``` 2. **通配符匹配**: `"*"`匹配任意字符,`"?"`匹配单个字符 ```excel =VLOOKUP("张*", $A$2:$C$100, 3, 0) ``` 3. **跨表查询**: 引用其他工作表数据 ```excel =VLOOKUP(A2, Sheet2!$A$2:$D$100, 4, 0) ``` [^1][^4]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值