微信小程序 van-dropdown-menu

点击其他按钮,关闭van-dropdown-menu下拉框

DropdownMenu 引入

在app.json或index.json中引入组件

"usingComponents": {
  "van-dropdown-menu": "@vant/weapp/dropdown-menu/index",
  "van-dropdown-item": "@vant/weapp/dropdown-item/index"
}

页面使用

下面是完成的使用步骤

index.wxml

<view class="seach-Main">
    <view class="class-main">
      <van-dropdown-menu 
      active-color="#FFD69A" 
      custom-class="menuMain" 
      >
        <van-dropdown-item
        title-class="ItemMain"
        value="{{ value1 }}" 
        options="{{ option1 }}"
        bind:change="onDropDownChange" 
        id="item"/>
      </van-dropdown-menu>
    </view>
    <van-search 
    class="search-text" 
    background="#000000" 
    value="{{ value }}" 
    placeholder="请输入产品编号/名称" 
    placeholder-style="font-size:28rpx;" 
    clearable="true" use-action-slot 
    left-icon="search" 
    bind:focus="onFocusClick" 
    bind:change="onChange" 
    bind:search="submitHandle">
      <view slot="action" bind:tap="submitHandle" style="color: #FFFFFF;">搜索</view>
    </van-search>
  </view>

index.scss

  .seach-Main {
    display: flex;
    justify-content: space-around;
    width: 100%;
    align-items: center;
    position: relative;
    
    .search-text {
      width: 100%;
    }

    .search-image {
      display: flex;
      position: absolute;
      width: 44rpx;
      left: 40rpx;

      image {
        width: 44rpx;
        height: 44rpx;
      }

    }
  }

  .seach-Main .van-search__content--square {
    background-color: var(--bannerBgColor) !important;
    border-radius: 10rpx 10rpx 10rpx 10rpx;
    border: 2rpx solid var(--bannerBgColor);
  }

  .seach-Main .cell-index--van-cell__value {
    text-align: left;

  }

  .seach-Main .van-field__control {
    color: var(--titleColor);
  }

  .seach-Main .van-cell__left-icon-wrap {
    color: var(--titleColor) !important;
  }

  // 选择
  .class-main {
    .menuMain {
      background-color: var(--mainBgColor);
    }

    .ItemMain {
      color: var(--titleColor);
    }
  }

  .van-cell {
    background-color: var(--bannerBgColor) !important;
    color: var(--titleColor) !important;
    border: none;
  }

  /* 样式文件 */
  .class-main .van-cell::after {
    border: none;
  }

上面var()都是引用的公共样式,可以换成自己项目需要的样式。

index.ts(重点)

在这里,需要实现输入框选中时,van-dropdown-menu组件需要关闭。所以在输入框组件里增加了bind:focus="onFocusClick"方法。在这个方法里面实现关闭操作。

// 输入框聚焦关闭组件
  onFocusClick() {
    this.selectComponent('#item').toggle(false);
  },

在这里插入图片描述

刚开始没注意官方文档的说明,现将该方法着重展示出来。

index.ts(全部)

Page({

  /**
   * 页面的初始数据
   */
  data: {
    value1: '',
    option1: [
      { text: '全部', value: '' },
      { text: '干货', value: 'GH' },
      { text: '调味', value: 'TW' },
    ],
    groupType:'', // 分类
    searchField:'',// 输入框搜索内容
},
// 输入框聚焦关闭
  onFocusClick() {
    this.selectComponent('#item').toggle(false);
  },
  // 筛选
  onDropDownChange(e: any) {
    let index = e.detail
    if (index == 0 && this.data.value1 == 0) {
      index = ''
    }
    this.setData({
      'groupType': index,
    })
  },
  // 输入框值改变时的方法
 onChange(e: any) {
    this.setData({
      searchField: e.detail,
    });
    // 调用搜索接口
    
  },
  // 点击搜索按钮方法
 submitHandle() {
  this.selectComponent('#item').toggle(false); // 关闭弹框
    var vkey = this.data.value;
    if (vkey) {
    // 搜索关键字不为空时的操作
    
    } else {
    // 搜索关键字为空时的操作
  
    }
  },


)}

最终效果如下:

点击其他方法,关闭van-dropdown-menu

### 解决方案 为了使 `van-dropdown-menu` 组件在页面滚动时不丢失位置或跟随滚动,可以通过调整组件的定位方式来实现。具体方法如下: #### 方法一:使用绝对定位 通过设置 `get-container` 属性为当前容器,并确保其内部元素采用相对或绝对定位而非固定定位。 ```html <van-dropdown-menu> <van-dropdown-item get-container=".container-class" v-model="repairService" :options="option1" :title="repairService || '请选择'" @change="onConfirm" /> </van-dropdown-menu> ``` 这里 `.container-class` 是指包含下拉菜单的具体父级 DOM 节点的选择器[^1]。 #### 方法二:自定义弹层样式 如果希望下拉框能够随着页面一起滚动,则需移除默认的 `position: fixed` 样式并改为其他形式的位置属性。可以在初始化时覆盖原有 CSS 或者利用框架提供的 API 来动态改变样式。 对于 Vant Weapp 版本来说,在某些情况下可能需要手动编辑源文件中的 WXML 结构,比如将 `@vant/weapp/dropdown-item/index.wxml` 文件内的 `<van-popup>` 的事件名称更改为驼峰命名法(如 `after-enter`, `after-leave`),从而解决因浏览器兼容性引起的问题[^5]。 另外一种做法是在 Vue 中直接操作 Popup 组件的相关配置项,例如将其显示模式设为浮层而不是固定的悬浮窗体;同时注意调整遮罩层(`overlay`)以及过渡效果(`transition`)等参数以适应不同场景下的需求[^4]。 最后值得注意的是,当涉及到移动端开发特别是微信小程序环境时,还需考虑设备特性所带来的影响因素,像屏幕尺寸差异、操作系统版本等因素都可能导致实际渲染结果有所偏差,因此建议开发者们多做测试验证最终呈现效果是否满足预期[^2]。 ```css /* 自定义popup样式 */ .van-popup { position: absolute !important; } ``` ```javascript // 动态控制popup行为 this.$refs.popup.open({ position: "absolute", }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力成为包租婆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值