Vue实现Element UI框架的自定义输入框或下拉框在输入时对列表选项进行过滤,以及右键列表选项弹出菜单进行删除

简介: 本文介绍了如何在Vue框架结合Element UI库实现自定义输入框或下拉框,在输入时对列表选项进行过滤,并支持右键点击列表选项弹出菜单进行删除的功能。

需求就是Element UI的输入框或下拉框在输入时过滤列表,还要支持右键删除列表的某一项,记录一下。

Html代码

<el-autocomplete
  size="mini"
  style="width:250px"
  v-model="product"
  clearable
  placeholder="请输入商品"
  :fetch-suggestions="filterProducts"
  @select="handleSelectProduct"
  @clear="handleRemoveProduct">
  <template slot-scope="{ item }">
    <h1 @contextmenu.prevent="openProductMenu($event)">{
  
  {item.name}}</h1>
  </template>
</el-autocomplete>

<!-- <el-select
  v-model="product"
  placeholder="请输入商品"
  filterable
  style="width:250px">
  <el-option
    v-for="item in productList"
    :key="item.name"
    :label="item.name"
    :title="item.name"
    :value="item.name" 
    style="width:250px;position:relative"
    @contextmenu.prevent.native="openProductMenu($event)">
  </el-option>
</el-select> -->

<!-- 商品右键菜单 -->
<ul
  v-show="productMenuVisible"
  :style="{
      
      left: productMenuLeft + 0 + 'px', top: productMenuTop - 10 + 'px'}"
  class="productline-menu">
  <li @click="handleDeleteProduct" style="padding: 0;"><el-button icon="el-icon-error" style="height: 30px;border: unset; width: 100px; display: block;padding: 0 10px; margin: 0;">删除</el-button></li>
</ul>

JS代码

data: () => ({
   
   
  // 产品
  product: ""

  // 右键菜单是否可见
  productMenuVisible: false,

  // 右键菜单左位移
  productMenuLeft: 0,

  // 右键菜单上位移
  productMenuTop: 0,

  // 右键选中的产品
  productObj: ""

  // 产品列表
  productList: [
    {
   
   
      "id": 1,
      "name": "金"
    },
    {
   
   
      "id": 2,
      "name": "木"
    },
    {
   
   
      "id": 3,
      "name": "水"
    },
    {
   
   
      "id": 4,
      "name": "火"
    },
    {
   
   
      "id": 5,
      "name": "土"
    }
  ]
}),

watch: {
   
   
  /**
    * 监听点击右键菜单区域
    */
  productMenuVisible(value) {
   
   
    if (value) {
   
   
      document.body.addEventListener('click', this.closeProductMenu);
    } else {
   
   
      document.body.removeEventListener('click', this.closeProductMenu);
    }
  }
},

methods: {
   
   
  /**
   * 打开商品右键菜单
   */
  openProductMenu(e) {
   
   
    const menuMinWidth = 105
    const offsetLeft = this.$el.getBoundingClientRect().left
    const offsetWidth = this.$el.offsetWidth
    const maxLeft = offsetWidth - menuMinWidth
    const left = e.clientX - offsetLeft
    if (left > maxLeft) {
   
   
      this.productMenuLeft = maxLeft
    } else {
   
   
      this.productMenuLeft = left
    }
    this.productMenuTop = e.clientY
    this.productMenuVisible = true
    this.productObj = e.currentTarget.innerHTML
  },

  /**
   * 关闭商品右键菜单
   */
  closeProductMenu() {
   
   
    this.productMenuVisible = false;
  },

  /**
   * 右键点击删除商品
   */
  handleDeleteProduct() {
   
   
    this.$confirm("此操作将删除【" + this.productObj + "】商品, 是否继续?", "提示", {
   
   
      confirmButtonText: "确定",
      cancelButtonText: "取消",
      type: "warning",
    })
    .then(() => {
   
   
      console.log("You are deleting the product of ", "'" + this.productObj + "'");
      // this.deleteProductByName(this.productObj);
    })
    .catch(() => {
   
   
      // ...
    });
  },

  /**
   * 根据查询字符串过滤商品
   */
  filterProducts(queryString, cb) {
   
   
    console.log("this.productList =>", this.productList)
    var restaurants = this.productList;
    var results = queryString
      ? restaurants.filter(this.createFilter(queryString))
      : restaurants;
    cb(results);
  },

  /**
   * 根据查询字符串过滤商品规则
   */
  createFilter(queryString) {
   
   
    return (restaurant) => {
   
   
      return (
        (restaurant.name.indexOf(queryString) != -1) || (restaurant.name.indexOf(queryString) != -1)
      );
    };
  },

  /**
   * 左键点击商品选项
   */
  handleSelectProduct(item) {
   
   
    this.form.product = item.name;
  },

  /**
   * 清空输入框
   */
  handleRemoveProduct() {
   
   
    this.form.product = '';
  }
}

Css代码

<style lang="less">
.productline-menu {
   
   
  position: absolute;
  margin: 0;
  background: #fff;
  z-index: 9999;
  list-style-type: none;
  padding: 5px 0;
  border-radius: 4px;
  font-size: 12px;
  font-weight: 400;
  color: #333;
  box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3);

  li {
   
   
    margin: 0;
    padding: 7px 16px;
    cursor: pointer;

    &:hover {
   
   
      background-color: #eee;
    }
  }
}
</style>

效果:

目录
相关文章
|
5月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
331 4
|
7月前
|
Web App开发 前端开发 JavaScript
Element UI框架中自定义input组件的placeholder样式。
确保这些样式在你的应用程序CSS文件中定义,且该文件已正确加载到项目中。通过以上方法,可以控制Element UI组件中input的placeholder样式,使其满足特定的设计要求。这些更改都是基于CSS伪元素进行的,因此并不会对DOM结构产生改变,保持了原有结构的简洁和高效。
635 12
|
7月前
|
存储 JavaScript 前端开发
element ui <el-date-picker> 设置展示当前月
在 Element UI 中,使用 `el-date-picker` 的 `value-format` 属性可将日期值格式化为指定字符串。设置 `type=&quot;month&quot;` 时,绑定值默认为 Date 对象,通过 `value-format=&quot;yyyy-MM&quot;` 可将其转为如 &quot;2023-05&quot; 格式,便于存储与处理。
1329 0
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
636 38
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
|
大数据 UED
「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表
List 和 Grid 是鸿蒙开发中的核心组件,用于展示动态数据。List 适合展示垂直或水平排列的数据列表,而 Grid 则适用于展示商品或图片的网格布局。本篇将展示如何封装组件,并通过按钮实现布局切换,提升界面的灵活性和用户体验。
821 9
「Mac畅玩鸿蒙与硬件16」鸿蒙UI组件篇6 - List和Grid组件展示数据列表
|
UED
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
本篇将带你实现一个自定义评分星级组件,用户可以通过点击星星进行评分,并实时显示评分结果。为了让界面更具吸引力,我们还将添加一只小猫图片作为评分的背景装饰。
320 6
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用
自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。
332 5
「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用
|
JavaScript 索引
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
Vue开发中Element UI/Plus使用指南:常见问题(如Missing required prop: “value“)及中文全局组件配置解决方案
1164 0
|
9月前
|
开发框架 前端开发 JavaScript
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发一
本文介绍了方舟开发框架(ArkUI)及其两种开发范式:基于ArkTS的声明式开发范式和类Web开发范式。ArkUI是用于构建HarmonyOS应用界面的UI框架,提供极简UI语法和基础设施。声明式开发范式使用ArkTS语言,以组件、动画和状态管理为核心,适合复杂团队协作;类Web开发范式采用HML、CSS、JavaScript三段式开发,适用于简单界面应用,贴近Web开发者习惯。文中还概述了两者的架构和基础能力,帮助开发者选择合适的范式进行高效开发。
303 15
|
9月前
|
编解码 前端开发 Java
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发三
本文介绍了基于声明式UI范式的图形绘制与动画效果实现方法,涵盖绘制图形、添加动画效果及常见组件说明三部分内容。在绘制图形部分,详细讲解了如何通过Circle组件为食物成分表添加圆形标签,以及使用Path组件结合SVG命令绘制自定义图形(如应用Logo)。动画效果部分则展示了如何利用animateTo实现闪屏动画,包括渐出、放大效果,并设置页面跳转;同时介绍了页面间共享元素转场动画的实现方式。最后,文章列举了声明式开发范式中的各类组件及其功能,帮助开发者快速上手构建复杂交互页面。
342 11