微信小程序+Vant-自定义选择器组件(单选带筛选

实现效果

  • 筛选是filter,搜索框如有显隐需要,需自行添加配置显隐参数
  • 弹出层高度样式需要手动修改,需自行添加配置高度参数
  • .json文件配置"component": true,

实现代码

组件代码
html 复制代码
<van-popup show="{{ show }}" position="bottom" round custom-style="height:100%;z-index:2000;" class="relative">
  <view class="pd-30 mb-30 fixed pickerTop w100 bg-white">
    <view class="flex">
      <view class="gray-3 fs14" bindtap="close">取消</view>
      <view class="pickerText bold">{{title}}</view>
      <view class="fs14" style="color: {{colorStyle}};" bindtap="getData">确认</view>
    </view>
    <view class="pd-20 mt-40 bg border radius-10 flex_l">
      <image src="../../../assets/img/search1.png" style="width: 40rpx;height: 40rpx;" mode="" class="mr-20" />
      <input bindinput="getSearch" placeholder="请输入">
      </input>
    </view>
  </view>
  <view class="plr-30 mulPicker">
    <van-checkbox-group value="{{ value }}" bind:change="onChange">
      <van-cell-group>
        <van-cell wx:for="{{ dataList }}" wx:key="index" value-class="value-class" clickable data-index="{{ index }}" bind:click="toggle">
          <van-checkbox catch:tap="noop" class="checkboxes-{{ index }}" checked-color="{{colorStyle}}" name="{{ item.dictValue * 1 }}">
            {{item.dictLabel}}
          </van-checkbox>
        </van-cell>
      </van-cell-group>
    </van-checkbox-group>
  </view>
</van-popup>
js 复制代码
// pages/menu/components/pickDateTime.js
Component({
  options: {
    addGlobalClass: true, // 可允许外部修改样式
  },
  /**
   * 组件的属性列表
   */
  properties: {
    show: Boolean,// 是否显示弹出层
    title: String, // 弹出层标题
    columns: {
      type: Array,
      value: [],
      observer: function () {
        this.handleData();
      }
    }, // 选择的数据
    value: Array,  // 选中的值
    colorStyle: {
      type: String,
      value: "#3772E9"
    },
    flag: String, // 1-服务对象 2-位置
  },
  /**
   * 组件的初始数据
   */
  data: {
    selectItem: null,
    dataList: [],
  },
  /**
   * 组件的方法列表
   */
  methods: {
    handleData() {
      this.setData({
        dataList: this.data.columns
      })
    },
    getData() {
      this.triggerEvent("getData", this.data.selectItem);
      this.close();
    },
    onChange(e) {
      console.log(e.detail);
      let item
      let list
      if (e.detail.length > 0) {
        if (e.detail.length > 1) {
          list = e.detail.splice(1, 1)
        } else {
          list = e.detail
        }
        item = this.properties.columns.find(r => r.dictValue == list[0])
      } else {
        item = null
        list = []
      }
      this.setData({ value: list, selectItem: item });
    },
    close() {
      console.log("pick");
      this.triggerEvent("close");
    },
    toggle(event) {
      const { index } = event.currentTarget.dataset;
      const checkbox = this.selectComponent(`.checkboxes-${index}`);
      checkbox.toggle();
    },
    noop() { },
    getSearch(event) {
      let { value, cursor, keyCode } = event.detail
      //keyCode 为键值,处理函数可以直接 return 一个字符串,将替换输入框的内容。
      /* wx.http('yourHttpUrl', {
        name: value
      }, 'post').then(data => {
        console.log('getSearch');
        let list = data.map(r => {
          return {
            ...r,
            dictValue: r.olderId,
            dictLabel: r.olderName
          }
        })
        this.setData({
          columns: list
        })
      }) */
      let list = this.data.columns.filter(item => item.nodeName?.includes(value))
      this.setData({
        dataList: value ? list : this.data.columns
      })
    }
  },
})
css 复制代码
/* pages/menu/components/pickDateTime.wxss */
.pickerText {
  font-size: 16px;
}

.pickerTop {
  border-radius: 50rpx 50rpx 0 0;
  z-index: 2000;
}

.mulPicker {
  margin-top: 240rpx;
}

.value-class {
  flex: none !important;
}
页面使用
html 复制代码
<w-picker show="{{show}}" columns="{{columns}}" title="{{title}}" bindgetData="getData" colorStyle="{{colorStyle}}" bindclose="close" />
js 复制代码
  getData(e) {
    console.log(e.detail);
    this.close();
  },
  close() {
    this.setData({
      show: false,
    })
  },
相关推荐
00后程序员张6 小时前
苹果App Store上架指南:费用、原理与步骤详解
android·ios·小程序·https·uni-app·iphone·webview
paopaokaka_luck14 小时前
个人综合管理小程序(echarts数据看板、健康数据记录与趋势查看、目标拆解和进度管理、日程待办与番茄钟、习惯打卡、收支统计、个人生活记录、跨模块智能提醒)
前端·javascript·spring·小程序·数据分析·echarts·生活
愚公搬代码15 小时前
【愚公系列】《微信小程序项目实战(AI编程+视频图解)》002-一张新地图:AI创业的核心分析框架
人工智能·微信小程序·ai编程
m0_587383001 天前
广州24小时自助健身房解决方案实战指南与系统部署要点
java·spring·小程序·架构·需求分析
ZeroNews内网穿透1 天前
企业内网穿透别再用随机域名!自有域名实现 OA/ERP 公网安全访问
微信小程序·内网穿透·erp·zeronews·运维实战·企业oa·自有域名
m0_587383001 天前
西安同城拼车软件开发实战指南:从零搭建高效系统
人工智能·小程序·数据挖掘·系统架构·需求分析
weixin_lynhgworld1 天前
抽取类盲盒小程序的五条合规红线意味着什么?
小程序
现任明教教主~1 天前
运营级多门店洗车贴膜汽车在线核销保养服务系统洗车预约洗车系统消费分佣扫码核销系统
微信小程序·小程序·汽车
小小王app小程序开发1 天前
盲盒微信小程序开发实战:架构、核心难点与实现方案
小程序
陪我去看海1 天前
被要求猛出小程序,做了这个多平台多环境的部署替我承受压力
前端·微信小程序·抖音小程序