uniapp 类似popover气泡下拉框组件

需要实现一个app端类似于elementUI上popover组件的下拉效果,发现uniapp和uview没找到合适的

以下组件仅测试过app,且细节处需要自行调整

描述: 点击更多按钮后弹出下拉框,点击其他区域会关闭下拉框

效果:

组件:

javascript 复制代码
<!-- 下拉菜单组件 -->
<template>
  <view class="custom-picker">
    <view class="picker-header" @click="togglePicker">
      更多
      <text class="arrow" :class="{ 'arrow-up': showPicker }"></text>
    </view>
    <view v-if="showPicker" class="picker-options">
      <view
        v-for="(item, index) in items"
        :key="index"
        @click="selectItem(item)"
        >{{ item.label }}</view
      >
    </view>
    <!-- 遮罩层,用于点击关闭 -->
    <view
      v-if="showPicker"
      class="mask"
      @click="closePicker"
      catchtouchmove
    ></view>
  </view>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      showPicker: false,
      selectedItem: '',
    }
  },
  methods: {
    togglePicker() {
      this.showPicker = !this.showPicker
    },
    closePicker() {
      this.showPicker = false
    },
    selectItem(item) {
      this.selectedItem = item
      this.showPicker = false
      this.$emit('change', item)
    },
  },
}
</script>

<style scoped>
.custom-picker {
  position: relative;
  z-index: 100;
}
.picker-header {
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}
.picker-options {
  position: absolute;
  width: 200rpx;
  top: 60rpx;
  left: -74rpx;
  border: 1px solid #ccc;
  border-radius: 5px;
  background-color: #fff;
  z-index: 101;
  color: #333;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
}
.picker-options view {
  padding: 10px;
  border-bottom: 1px solid #eee;
}
.picker-options view:last-child {
  border-bottom: none;
}
.arrow {
  margin-left: 8rpx;
  width: 0;
  height: 0;
  border-left: 12rpx solid transparent;
  border-right: 12rpx solid transparent;
  border-top: 16rpx solid #ffffff;
  transition: transform 0.3s;
  position: relative;
  top: 2rpx;
}
.arrow-up {
  transform: rotate(180deg);
  top: -2rpx;
}
.mask {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 99;
  background-color: transparent;
}
</style>

调用

javascript 复制代码
 <custom-picker :items="items" @change="onCustomPickerChange"></custom-picker>

 items: [
        { label: '删除' },
        { label: '详情' },
        { label: '停用' },
      ],

 onCustomPickerChange(e) {
      console.log(e)
    },
相关推荐
Csvn5 分钟前
structuredClone:原生深拷贝 API 的正确打开方式
前端
大猫会长10 分钟前
获取favicon.ico的方法
前端·javascript·html
无人生还10 分钟前
从 Vue3 到 React · 快速上手系列第 5 篇:事件处理与表单(受控组件 vs v-model)
前端·vue.js·react.js
默_笙14 分钟前
🎀 大模型说"呀"还是"吗"?temperature 和 Top K 在偷偷控制它的"性格"
前端·javascript
渣波14 分钟前
别再死磕MySQL了!用Milvus+LangChain给AI加个“海马体”,手把手带你写个RAG日记本
前端
乌夷17 分钟前
vue知识点
前端·javascript·vue.js
用户4468460048020 分钟前
C 语言分支与循环语句总结
css
何时梦醒23 分钟前
🚀 从零上手 Milvus 向量数据库:打造一个 AI 智能日记本
前端·人工智能
blns_yxl25 分钟前
拖拽排序列表(HTML+JS)
前端·javascript·html
Data26 分钟前
把 React 前端做成「插件市场」:前后端联动的行业包可插拔架构
前端