微信小程序(三十)自定义可搜索的picker组件

简介: accountbindTwo.jsjavascript

PC端开发,组件库是有可搜索的select可用

但是在手机端微信小程序开发的时候,使用select就不太合适了,小程序端的选项一般都是是使用picker

但是,问题又来了,微信小程序官方并没有给我们提供可搜索的Picker

人家没给,那我们就自定义一个呗

别的到没啥,就是感觉交互上有点奇怪

具体效果如下图所示:

image.png

 

废话不多说了,上代码:

myPicker.wxml

ini

复制代码

<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="searchSchool"
        />
        <view bindtap='confirm'>确定</view>
      </view>
      <picker-view
        indicator-class="indicator"
        value="{{setValues}}"
        bindchange="bindChange"
        bindpickend="_bindpickend"
        indicator-style="height: 100rpx;"
        mask-style="height:900rpx;"
        style="width: 100%; height: 90%;position:absolute;bottom:0rpx;text-align:center;background:white"
      >
        <picker-view-column class="pickViewColumn">
          <view wx:for="{{items}}" wx:key="id" style="line-height: 104rpx">{{item.name}}</view>
        </picker-view-column>
      </picker-view>
    </view>
  </view>
</view>

myPicker.js

javascript

复制代码

Component({
  options: {
    // 在组件定义时的选项中启用多slot支持
    multipleSlots: true
  },
  /**
   * 组件的属性列表
   */
  properties: {
    // 初始化日期
    initValue: {
      type: String,
      value: ''
    },
    // 父组件传递过来的数据列表
    items: {
      type: Array,
      value: []
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
    //控制picker的显示与隐藏
    flag: true,
    // 用户输入的学校关键词
    searchValue:'',
    // 滚动选择的学校
    setValues: [],
    // 滚动选择的学校索引
    selectSchoolIndex:''
  },
  /**
   * 组件的方法列表
   */
  methods: {
  /**
  * @name: 搜索学校
  * @author: camellia
  * @date: 20211129
  */
  searchSchool(e)
  {
    let self = this;
    self.triggerEvent('searchSchool', e.detail);
  },
  /**
  * @name: 隐藏picker
  * @author: camellia
  * @date: 20211129
  */
  hiddeDatePicker()
  {
    let self = this;
    self.setData({
      flag: !self.data.flag
    })
  },
  /**
  * @name: 展示picker
  * @author: camellia
  * @date: 20211129
  */
  showDatePicker()
  {
    let self = this;
    self.setData({
      flag: !self.data.flag
    })
    self.getItems()
  },
  /**
  * @name: 选择好学校后,点击确定
  * @author: camellia
  * @date: 20211129
  */
  confirm()
  {
    let self = this;
    // 获取用户选择的学校
    let item = self.data.items[self.data.selectSchoolIndex]?self.data.items[self.data.selectSchoolIndex]:self.data.items[0];
    // 通过发送自定义事件把用户选择的学校传递到父组件
    self.triggerEvent('confirm', item);
  },
  /**
  * @name: 用户滚动picker时,获取滚动选择的索引
  * @author: camellia
  * @date: 20211129
  */
  bindChange(e)
  {
    let self = this;
    self.setData({
      // 用户选择的学校索引
      selectSchoolIndex:e.detail.value[0]
    })
  },
  /**
   * @name: 获取初始化信息
   * @author: camellia
   * @date: 20211130
   */
  getItems(e)
  {
    let self = this;
    if (self.data.items.length && self.data.initValue) {
      let items = self.data.items
      for (let i = 0; i < items.length; i++) {
        if (self.data.initValue == items[i].id) {
          self.setData({
            setValues: [i]
          })
          return
        }
      }
    }
    self.setData({
      setValues: [0]
    })
  },
},
})
myPicker.wxss
css
复制代码
.date-background {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
}
.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;
}
.indicator{
  height: 80rpx;
  border: 1rpx solid #E5E8E8;
  }

 

myPicker.json

json

复制代码

{
  "component": true,
  "usingComponents": {
      "van-search": "@vant/weapp/search/index"
  }
}

调用组件:

accountbindTwo.json

json

复制代码

{
  "usingComponents": {
    "myPicker":"/components/myPicker/myPicker"
  }
}

 

accountbindTwo.wxml

xml

复制代码

            <!-- 填写学校 -->            <viewclass="Info_Item Item_School">                <viewclass="School FLOAT_LEFT" >学校 /University : </view>                <viewclass="require FLOAT_RIGHT">*</view>                <!-- 学校输入框 -->                <viewclass="FLOAT_RIGHT">                    <view  class="School_Input"  style="{{school_id?'':'color:#808080'}};{{schoolValidate?'border:1rpx solid #BD3731':''}}"bindtap="showSchoolPicker">{{school_name}}                    </view>                    <!-- 学校输入框右侧三角按钮 -->                        <viewclass="schoolDrop_icon" >                            <van-imagewidth="22rpx"height="16rpx"src="/images/expand.png" ></van-image>                        </view>                </view>            </view>
<!-- 填写学校 -->
            <view class="Info_Item Item_School">
                <view class="School FLOAT_LEFT" >学校 /University : </view>
                <view class="require FLOAT_RIGHT">*</view>
                <!-- 学校输入框 -->
                <view class="FLOAT_RIGHT">
                    <view  class="School_Input"  style="{{school_id?'':'color:#808080'}};{{schoolValidate?'border:1rpx solid #BD3731':''}}" bindtap="showSchoolPicker">{{school_name}}
                    </view>
                    <!-- 学校输入框右侧三角按钮 -->
                        <view class="schoolDrop_icon" >
                            <van-image width="22rpx" height="16rpx" src="/images/expand.png" ></van-image>
                        </view>
                </view>
            </view>

 

accountbindTwo.js

javascript

复制代码

/**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    let self = this;
    // 获取自定义学校picker实例
    self.demopicker = self.selectComponent("#demopicker");
  },
/**
   * @name: 点击学校输入框,展示选择学校picker
   * @author: camellia
   * @date: 20211129
   */
  showSchoolPicker()
  {
    let self = this;
    self.demopicker.showDatePicker()
  },
  /**
   * @name: 点击picker确定按钮,隐藏选择学校picker
   * @author: camellia
   * @param:e:自定义组件传递的参数,该参数里保存了用户选择的学校id和name
   * @date: 20211129
   */
  confirmSchool(e){
    let self = this;
    // 隐藏自定义picker
    self.demopicker.hiddeDatePicker();
  },

以上就是自定义可搜索的picker组件的代码以及调用实例

最后,提示一下,我这里的搜索框使用的是vant微信小程序组件库,picker使用的微信小程序的原生组件。这个需要注意一下。

有好的建议,请在下方输入你的评论。

欢迎访问个人博客:guanchao.site

欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”

目录
相关文章
|
1月前
|
搜索推荐 SEO
谈微信搜索SEO(搜一搜)怎么排名第一
谈微信搜索SEO(搜一搜)怎么排名第一
109 54
|
1月前
|
小程序 前端开发 JavaScript
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
37 0
在线课堂+工具组件小程序uniapp移动端源码
|
1月前
|
小程序 机器人 开发者
QQ 小程序已发布,但无法被搜索的解决方案
我的 QQ 小程序在 2024 年 8 月就已经审核通过,上架后却一直无法被搜索到。打开后,再在 QQ 上下拉查看 “最近使用”,发现他出现一下又马上消失。
46 2
|
2月前
|
小程序 数据可视化 JavaScript
微信小程序:轻松实现时间轴组件
本文介绍了如何在微信小程序中实现一个可视化时间轴组件。该组件适用于展示用户资金流动、投资结算等时间节点,帮助用户直观了解资金去向。时间轴支持自定义节点形状、显示序号、倒序排列等功能,并通过插槽灵活定义动态内容。文中详细介绍了组件的设计与使用方法,以及如何结合动态 slot 实现自定义操作。该组件为展示用户资金信息提供了美观、易用的解决方案。
72 1
微信小程序:轻松实现时间轴组件
|
2月前
|
小程序
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
微信小程序动态tabBar实现:基于自定义组件,灵活支持不同用户角色与超过5个tab自由组合(更新版)
657 1
|
2月前
|
小程序 搜索推荐 API
微信小程序:自定义关注公众号组件样式
尽管关注公众号组件的样式固定且不可修改,但产品经理的需求却需要个性化的定制。在这种情况下,我们需要寻找解决方案,以满足这些特殊需求,尽管这可能有点棘手。
83 0
微信小程序:自定义关注公众号组件样式
|
2月前
|
小程序 前端开发 JavaScript
微信小程序图表制作利器:ECharts组件的使用与技巧
微信小程序图表制作利器:ECharts组件的使用与技巧
81 1
|
2月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
359 3
|
2月前
|
小程序 API
微信小程序更新提醒uniapp
在小程序开发中,版本更新至关重要。本方案利用 `uni-app` 的 `uni.getUpdateManager()` API 在启动时检测版本更新,提示用户并提供立即更新选项,自动下载更新内容,并在更新完成后重启小程序以应用新版本。适用于微信小程序,确保用户始终使用最新版本。以下是实现步骤: ### 实现步骤 1. **创建更新方法**:在 `App.vue` 中创建 `updateApp` 方法用于检查小程序是否有新版本。 2. **测试**:添加编译模式并选择成功状态进行模拟测试。
60 0
微信小程序更新提醒uniapp
|
4月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
117 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目