封装能搜索的小程序picker

需求是这样子的,微信原生的满足不了这种,所以自己封装了个组件

这个组件用到了vant 这个框架 里的vant-search ,也可以不用自己写个input,方法都是一样的

wxml部分

<view class="date-background" hidden="{{flag}}">
  <view class='date-gray-background' bindtap='hiddeDatePicker'></view>
  <view class='date-container'>
    <view class="transparent">
      <view class='date-confirm'>
        <view bindtap='hiddeDatePicker'>取消</view>
        <van-search
          value="{{searchValue}}"
          input-align="center"
          placeholder="请输入关键词"
          bind:change="search"
        />
        <view bindtap='confirm'>确定</view>
      </view>
      <picker-view
        indicator-class="indicator"
        value="{{setValues}}"
        bindchange="bindChange"
        bindpickend="_bindpickend"
        immediate-change="{{true}}" 
      >
 
        <picker-view-column class="pickViewColumn">
          <text wx:for="{{items}}" wx:key="index" style="color:#000;line-height:46px;text-align:center;display:block" decode="{{true}}" >{{item.name}}</text>
        </picker-view-column>
      </picker-view>
    </view>
  </view>
</view>
Component({
  options: {
    // 在组件定义时的选项中启用多slot支持
    multipleSlots: true,
  },
  /**
   * 组件的属性列表
   */
  properties: {
    // 初始化日期
    initValue: {
      type: String,
      value: "",
    },
    // 父组件传递过来的数据列表
    items: {
      type: Array,
      value: [],
    },
    Values: {
      type: Number,
      value:0,
    },
  },
  /**
   * 组件的初始数据
   */
  data: {
    //控制picker的显示与隐藏
    flag: true,
    // 用户输入的item关键词
    searchValue: "",
    // 滚动选择的item
    setValues: [],
    // 滚动选择的item索引
    selectIndex: "",
  },
  /**
   * 组件的方法列表
   */
  methods: {
    /**
     * @name: 搜索item
     * @date: 20211129
     */
     search(e) {
      console.log('触发search事件')
      let self = this;
      self.triggerEvent("handleSearch", e.detail);
    },
    /**
     * @name: 隐藏picker
     * @date: 20211129
     */
    hiddeDatePicker() {
      let self = this;
      self.setData({
        flag: !self.data.flag,
        searchValue: "",
      });
    },
    /**
     * @name: 展示picker
     * @date: 20211129
     */
    showDatePicker() {
      let self = this;
      self.setData({
        flag: !self.data.flag,
      });
      self.getItems();
    },
    /**
     * @name: 选择好item后,点击确定
     * @date: 20211129
     */
    confirm() {
      let self = this;
      // 获取用户选择的item
      console.log(self.data.selectIndex, "self.data.selectIndex");
      let item = self.data.items[self.data.selectIndex]
        ? self.data.items[self.data.selectIndex]
        : self.data.items[0];
      let selectIndex = self.data.selectIndex;
      // 通过发送自定义事件把用户选择的item传递到父组件
      console.log(item, "itemitem");
      //取name 是因为从父组件传来的数据 格式已经处理成name:xxxxx
      self.triggerEvent("confirm", {
        name: item.name,
        toback: item.toback, //传到后台的数据
        selectIndex: selectIndex,
      });
    },
    /**
     * @name: 用户滚动picker时,获取滚动选择的索引
     * @author: camellia
     * @date: 20211129
     */
    bindChange(e) {
      let self = this;
      console.log(e, "eee");
      self.setData({
        // 用户选择的item索引
        selectIndex: e.detail.value[0],
      });
    },
    /**
     * @name: 获取初始化信息
     * @date: 20211130
     */
    getItems(e) {
      let self = this;
      console.log(self.data.items, "获取父组件的item");
      console.log(self.data.initValue, "initValue");
      console.log(self.data.Values, "Values");
      if (self.data.items[0].name) {
        self.setData({
          setValues: [self.data.Values],
        });
      } else {
//如果没有数据
        self.setData({
          setValues: [0],
        });
        console.log(self.data.setValues,"setValuessetValues")
      }

      
    },
  },
});
.date-background {
  /* position: absolute; */
  position: fixed;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  z-index: 2000;
}
.date-gray-background {
  position: absolute;
  width: 100%;
  top: 0;
  background: rgba(0, 0, 0, .5);
  height: calc(100% - 500rpx);
}
.date-container {
  position: absolute;
  width: 100%;
  height: 900rpx;
  overflow: hidden;
  background: #fff;
  bottom:0;
  z-index: 1000;
}

.date-confirm {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding:0 20rpx;
  font-size:34rpx;
  line-height: 70rpx;
  color:var(--ThemeColor)
}
.pickViewColumn{
  height: 900rpx;
  /* margin-top: -300rpx; */
  /* text-align: center; */
 text-align: left;
}
.indicator{
height: 80rpx;
border: 1rpx solid #E5E8E8;
}
{
    "component": true,
    "usingComponents": {
        "van-search": "../../../../miniprogram_npm/@vant/weapp/search/index"
    }
}

在引用的页面 wxml上写

<myPicker id="demopicker" items="{{pickerItems}}" Values="{{pickerItemsIndex}}" bindhandleSearch="handleSearch" bindconfirm="confirm"></myPicker>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的微信小程序日期时间组件的封装示例,它包括日期选择器和时间选择器: 1. 在小程序的 components 目录下创建一个名为 "datetime-picker" 的文件夹,并在该文件夹下创建一个名为 "datetime-picker.wxml" 的文件。 2. 在 datetime-picker.wxml 文件中,编写以下代码: ```html <view class="datetime-picker"> <picker mode="date" value="{{value}}" bindchange="bindDateChange"> <view class="picker"> {{year}}年{{month}}月{{day}}日 </view> </picker> <picker mode="time" value="{{value}}" bindchange="bindTimeChange"> <view class="picker"> {{hour}}时{{minute}}分 </view> </picker> </view> ``` 3. 在 datetime-picker.wxml 文件同级目录下创建一个名为 "datetime-picker.js" 的文件,并编写以下代码: ```javascript Component({ /** * 组件的属性列表 */ properties: { value: { type: String, value: '' } }, /** * 组件的初始数据 */ data: { year: '', month: '', day: '', hour: '', minute: '', }, /** * 组件的方法列表 */ methods: { bindDateChange: function (e) { const value = e.detail.value; const date = new Date(value); const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); this.setData({ year, month, day }) this.triggerEvent('change', { value: this.data.year + '-' + this.data.month + '-' + this.data.day + ' ' + this.data.hour + ':' + this.data.minute }); }, bindTimeChange: function (e) { const value = e.detail.value; const date = new Date(value); const hour = date.getHours(); const minute = date.getMinutes(); this.setData({ hour, minute }) this.triggerEvent('change', { value: this.data.year + '-' + this.data.month + '-' + this.data.day + ' ' + this.data.hour + ':' + this.data.minute }); }, }, ready: function () { const value = this.properties.value; if (value) { const date = new Date(value); const year = date.getFullYear(); const month = date.getMonth() + 1; const day = date.getDate(); const hour = date.getHours(); const minute = date.getMinutes(); this.setData({ year, month, day, hour, minute }) } else { const now = new Date(); const year = now.getFullYear(); const month = now.getMonth() + 1; const day = now.getDate(); const hour = now.getHours(); const minute = now.getMinutes(); this.setData({ year, month, day, hour, minute }) } } }) ``` 4. 在 datetime-picker 文件夹下创建一个名为 "datetime-picker.wxss" 的文件,并编写以下代码: ```css .datetime-picker { display: flex; justify-content: space-between; align-items: center; } .picker { height: 100%; display: flex; justify-content:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值