小程序van-popup组件实现模糊搜索,后选择功能

这篇博客介绍了如何利用VantWeapp框架为小程序开发一个具备搜索功能的下拉选择框。首先导入必要的组件,然后通过调用API获取数据并进行处理,以满足van-picker的需求。接着,设置了开启、关闭控件以及用户选择和搜索事件的处理函数。在搜索功能中,利用toLowerCase()实现不区分大小写的匹配,并动态更新选项。最后,修改了UserIdentification事件以避免出现错误。整个过程详细展示了搜索控件的实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着WEB前端的发展,现在大部分的前端工程师都已经走上了小程序开发的征程,不管是PC端还是手机端,选择一款优秀框架对项目开发都是至关重要的,个人比较喜欢的小程序框架是Vant Weapp
那么今天我们就看看选择下拉框且带有搜索功能的框怎么去实现,其实Vant本身的选择下拉控件是没有索索功能的 需要我们手工合成一个
json中我们导入必要的控件

{
   "usingComponents": {
     "van-search": "vant-weapp/search",
     "van-popup": "vant-weapp/popup",
     "van-picker": "vant-weapp/picker"
   }
 }

然后我们调请求去那要用户选择的数据列表
这一步就不用我教了吧

 CustomerGetAllList({
}).then((src) => {
   let list = src.data.data;
   for(let i = 0;i < list.length;i++){
     list[i].text = list[i].customerName;
     list[i].disabled = false
   }
   this.setData({
     UserList: list
   })
 })

刚从后端拿回的数据自然是有必要处理一下的,因为van-picker要求数据是
一个对象数组 然后每一个下标对象 要有一个text对象 作为选项名称 有一个
disabled作为默认选中状态
然后我们在data中设置UserSwitch变量 默认值位false 作为这个控件的开关
然后我们需要在js中添加几个事件

  //开启控件
 UserOn: function(){
    this.setData({
      UserSwitch: true
    })
  },
  //关闭控件
   UserShutdown: function(){
    this.setData({
      UserSwitch: false
    })
  },
  //用户选择某个选项后触发事件
  UserIdentification(event){
	    console.log(event.detail.value.id);
  },

WXML

<van-popup
  show="{{ UserSwitch }}"
  closeable
  position="bottom"
  custom-style="height: 45%"
  bind:close="UserShutdown"
>
   <van-picker
      show-toolbar
      wx:if = "{{ UserList.length != 0 }}"
      title="请选择库位"
      columns="{{ UserList }}"
      bind:cancel="UserShutdown"
      bind:confirm="UserIdentification"
   />
</van-popup>

然后当我们触发UserOn事件后就会出现这样的效果
在这里插入图片描述
选择某个选项后点击确定也会打印在控制器上,可以根据自己的情况修改选择确定后的那个UserIdentification事件
然后在data中设置UserNameIndexes 默认值为空字符
作为搜索条件

//条件输入事件
 setUserNameIndexes(event){
    this.setData({
      UserNameIndexes: event.detail,
    });
  },

在data中声明UserBackups备份UserList的数据
在最初请求给UserList负值位置编写

CustomerGetAllList({
}).then((src) => {
   let list = src.data.data;
   for(let i = 0;i < list.length;i++){
     list[i].text = list[i].customerName;
     list[i].disabled = false
   }
   this.setData({
     UserList: list,
     UserBackups: list
   })
 })

在data中声明cognizance默认值为空字符

//点击确定搜索时触发事件
  UserVague: function(){
    wx.showToast({
      title: '加载中',
      icon: "loading",
      duration: 1000
    })
    let row = [];
    if(this.data.UserNameIndexes){
      row = this.data.UserBackups.filter((e) => e.text.toLowerCase().indexOf(this.data.UserNameIndexes.toLowerCase()) != -1)
    }else{
      row = this.data.UserBackups
    }
    this.setData({
      cognizance: this.data.UserNameIndexes,
      UserList: row
    })
  },

可能很多人会奇怪为什么要toLowerCase()
其实很简单 因为indexOf是不区分大小写的
就是A和A可以匹配 但 A和a就不行了
然后我们修改前面的页面控件代码

<van-popup
  show="{{ UserSwitch }}"
  closeable
  position="bottom"
  custom-style="height: 45%"
  bind:close="UserShutdown"
>
    <van-search
      style="width:100%;display: block;"
      value="{{ UserNameIndexes }}"
      placeholder="请输入用户名"
      use-action-slot
      bind:change="setUserNameIndexes"
      bind:search="UserVague"
    >
      <view
         slot="action"
         bind:tap="UserVague"
         style="color:#1296db;"
      >
         搜索
      </view>
    </van-search>
   <view class = "grafting" wx:if = "{{ UserList.length == 0 }}">无数据</view>
   <van-picker
      show-toolbar
      wx:if = "{{ UserList.length != 0 }}"
      title="请选择库位"
      columns="{{ UserList }}"
      bind:cancel="UserShutdown"
      bind:confirm="UserIdentification"
   />
</van-popup>

然后我们的页面效果机会变成这样
![在这里插入图片描述](https://img-blog.csdnimg.cn/47ed7bb64c6c48e2be7f72801bbd9c20.jpg?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6aOe6Iqx在这里插入图片描述
大家可以搜索一下这个事件还是很好用的

最后我们需要修改一下UserIdentification事件 不然就会出BUG

 UserIdentification(event){
    let id = event.detail.value.id;
    let UserBackups = this.data.UserBackups;
    let UserList = [];
    for(let i = 0;i < UserBackups.length;i++){
      if(UserBackups[i].id == id){
        console.log(UserBackups[i]);
        UserBackups[i].disabled = true;
      }else{
        UserBackups[i].disabled = false;
      }
      if(this.data.cognizance){
        if(UserBackups[i].text.toLowerCase().indexOf(this.data.cognizance.toLowerCase()) != -1){
          UserList.push(UserBackups[i]);
        }
      }else{
        UserList.push(UserBackups[i]);
      }
    }
    this.setData({
      UserList: UserList,
      UserBackups: UserBackups
    })
  },

这样我们的一个搜索控件就完成了。
你,学(废)了吗?

<think>好的,用户想在微信小程序中使用van-popup实现城市选择器。首先,我需要确认van-popupvan-datetime-picker的用法,因为用户提到了这两个组件。根据引用[2]和[3],van-popup通常用来包裹其他选择组件,比如时间选择器,而城市选择器可能需要自定义数据结构和列。 用户可能需要一个多列选择器,显示省、市、区三级联动。这时候应该使用van-area组件,但如果是自定义数据,可能需要用van-picker并设置columns属性。引用[3]提到处理columns时需要dictLabel和dictValue字段,所以数据需要格式化。 然后,考虑如何将van-area嵌入到van-popup中。代码结构可能是在van-popup里放置van-area,并通过v-model控制显示。同时,需要处理确认和取消事件,更新选中的城市数据。 还需要注意引入Vant组件,确保json文件中正确配置,以及样式文件的引入。此外,用户可能需要展示选中的城市,所以需要绑定一个变量来存储结果。 最后,检查可能的错误点,比如数据格式是否正确,事件绑定是否匹配,以及van-popup的显示状态控制。如果有三级联动数据,可能需要后端接口或本地数据文件,这里假设用户已有数据源。</think>以下是在微信小程序中使用`van-popup`实现城市选择器的详细实现方法: ### 一、实现步骤 1. **安装Vant组件** ```json // package.json { "dependencies": { "@vant/weapp": "^1.10.2" } } ``` 2. **基础结构代码** ```html <!-- index.wxml --> <van-popup show="{{ showCityPicker }}" position="bottom" bind:close="onCloseCityPicker" > <van-area value="{{ currentCityCode }}" columns-num="{{ 3 }}" bind:confirm="onCityConfirm" bind:cancel="onCloseCityPicker" /> </van-popup> <van-cell title="选择城市" value="{{ selectedCity }}" bind:click="showCityPicker = true" /> ``` 3. **数据逻辑处理** ```javascript // index.js Page({ data: { showCityPicker: false, currentCityCode: '', // 默认选中的行政区代码 selectedCity: '请选择' }, onCityConfirm(e) { const values = e.detail.values; const cityText = values .filter(item => item) .map(item => item.name) .join('/'); this.setData({ selectedCity: cityText, currentCityCode: values[values.length-1].code, showCityPicker: false }); }, onCloseCityPicker() { this.setData({ showCityPicker: false }); } }); ``` 4. **样式调整(可选)** ```css /* index.wxss */ .van-popup--bottom { border-radius: 16rpx 16rpx 0 0; } ``` ### 二、关键特性说明 1. **三级联动数据**:使用`van-area`组件自带全国省市区数据[^1] 2. **数据绑定**:通过`currentCityCode`可设置默认选中地区 3. **自定义样式**:可通过修改CSS实现圆角、高度等样式调整[^2] ### 三、自定义数据版本 如需使用自定义数据格式(参考引用[3]): ```javascript // 转换数据格式 processData(originData) { return originData.map(province => ({ dictLabel: province.name, dictValue: province.id, children: province.cities.map(city => ({ dictLabel: city.name, dictValue: city.id, children: city.areas.map(area => ({ dictLabel: area.name, dictValue: area.id })) })) })); } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值