vue中下拉框组件的封装方式

下面是Vue中下拉框组件的封装方式的完整攻略。

1. 需求分析

在实现下拉框组件之前,我们需要先明确需求。下拉框组件是一个常用的UI组件,在业务开发中使用频率较高。下拉框组件需要具备以下特性:

  • 可以展示选项
  • 可以展开和关闭选项
  • 可以选择选项,选择后可以展示该选项的文本或图标
  • 支持多选或单选模式
  • 支持异步数据加载

2. 基本组件结构

在实现组件之前,我们需要先确定组件的基本结构。一个下拉框组件应该包含以下几个部分:

  • .vue文件的template模板,展示选项列表和选项的文本和图标。
  • .vue文件的script脚本,用于处理组件逻辑,如显示隐藏下拉框、选择选项等。
  • .vue文件的style样式,用于自定义组件样式。

3. 封装下拉框组件

我们可以使用Vue.extend 方法来创建一个新的Vue组件,然后再进行封装下拉框组件。

3.1 异步加载数据

封装下拉框组件需要考虑业务的特殊性。如果下拉框选项是固定的,那么我们可以直接在组件中定义一个options数组,存储下拉框的选项。但是,如果选项需要通过异步请求后才能获取到,我们在封装组件时,需要针对不同的业务场景做出不同的处理。

组件异步加载数据的方式有很多种,我们这里介绍一种使用Axios异步请求数据的方式。

<template>
  <div class="dropdown-container">
    <div class="dropdown-header" @click="toggle">
      <div class="dropdown-input">{{ value }}</div>
      <div class="dropdown-arrow"></div>
    </div>
    <div class="dropdown-options" v-if="isOpen">
      <div class="dropdown-option" v-for="(option, index) in options" :key="index" @click="select(option)">
        {{ option.label }}
      </div>
    </div>
  </div>
</template>

<script>
  import axios from 'axios';

  export default {
    props: {
      url: String
    },
    data() {
      return {
        isOpen: false,
        isLoading: false,
        options: null,
        value: ''
      }
    },
    methods: {
      async fetchData() {
        this.isLoading = true;
        try {
          const res = await axios.get(this.url);
          this.options = res.data;
        } catch (error) {
          console.log(error);
        }
        this.isLoading = false;
      },
      toggle() {
        if (!this.options) {
          // 如果选项未加载,就异步请求数据
          this.fetchData();
          return;
        }
        this.isOpen = !this.isOpen;
      },
      select(option) {
        this.value = option.label;
        this.isOpen = false;
        this.$emit('select', option.value);
      }
    }
  }
</script>

<style scoped>
  /* 样式省略 */
</style>

3.2 单选模式

单选模式的下拉框组件在基本结构上与多选模式的下拉框组件有所不同。单选模式的下拉框只能选择一项,当选择时,其他选项将被自动关闭。

<template>
  <div class="dropdown-container">
    <div class="dropdown-header" @click="toggle">
      <div class="dropdown-input">{{ value }}</div>
      <div class="dropdown-arrow"></div>
    </div>
    <div class="dropdown-options" v-if="isOpen">
      <div class="dropdown-option" v-for="(option, index) in options" :key="index" :class="{ active: option.value === selectedValue }" @click="select(option)">
        {{ option.label }}
      </div>
    </div>
  </div>
</template>

<script>
  import axios from 'axios';

  export default {
    props: {
      url: String
    },
    data() {
      return {
        isOpen: false,
        isLoading: false,
        options: null,
        selectedValue: null,
        value: ''
      }
    },
    methods: {
      async fetchData() {
        this.isLoading = true;
        try {
          const res = await axios.get(this.url);
          this.options = res.data;
        } catch (error) {
          console.log(error);
        }
        this.isLoading = false;
      },
      toggle() {
        if (!this.options) {
          // 如果选项未加载,就异步请求数据
          this.fetchData();
          return;
        }
        this.isOpen = !this.isOpen;
      },
      select(option) {
        this.selectedValue = option.value;
        this.value = option.label;
        this.isOpen = false;
        this.$emit('select', option.value);
      }
    }
  }
</script>

<style scoped>
  /* 样式省略 */
</style>

3.3 多选模式

多选模式的下拉框组件在基本结构上与单选模式的下拉框组件有所不同,多选模式的下拉框需要添加多选框,并支持手动选择和取消选择多选框。

<template>
  <div class="dropdown-container">
    <div class="dropdown-header" @click="toggle">
      <div class="dropdown-input">{{ value }}</div>
      <div class="dropdown-arrow"></div>
    </div>
    <!-- 添加多选框 -->
    <div class="dropdown-options" v-if="isOpen">
      <div class="dropdown-option" v-for="(option, index) in options" :key="index">
        <label>
          <input type="checkbox" :value="option.value" v-model="selectedValues">
          {{ option.label }}
        </label>
      </div>
    </div>
  </div>
</template>

<script>
  import axios from 'axios';

  export default {
    props: {
      url: String
    },
    data() {
      return {
        isOpen: false,
        isLoading: false,
        options: null,
        selectedValues: [],
        value: ''
      }
    },
    methods: {
      async fetchData() {
        this.isLoading = true;
        try {
          const res = await axios.get(this.url);
          this.options = res.data;
        } catch (error) {
          console.log(error);
        }
        this.isLoading = false;
      },
      toggle() {
        if (!this.options) {
          // 如果选项未加载,就异步请求数据
          this.fetchData();
          return;
        }
        this.isOpen = !this.isOpen;
      },
    },
    computed: {
      // 用computed属性计算选中的值的文本
      selectedLabels() {
        const labels = [];
        this.options.forEach((option) => {
          if (this.selectedValues.includes(option.value)) {
            labels.push(option.label);
          }
        });
        return labels.join(',');
      }
    },
    watch: {
      selectedValues(newValues) {
        this.value = this.selectedLabels;
        this.$emit('select', newValues);
      }
    }
  }
</script>

<style scoped>
  /* 样式省略 */
</style>

4. 总结

上述示例中,我们分别封装了单选和多选模式下拉框组件,其余的功能,如开发者自定义每个选项的渲染方式、搜索选项和按字母排序等,可以根据具体业务场景进行扩展。如果您有需要封装其他的Vue组件,同样可以按照这样的方式进行实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue中下拉框组件的封装方式 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • 5-5springgateway网关-y_zoran-博客园

    5-5 Spring Gateway网关 – y_zoran – 博客园 什么是Spring Cloud Gateway Spring Cloud Gateway是Spring Cloud生态系统中的网关。类似于ZUUL网关,它可以处理路由请求,执行过滤等操作,可以实现对微服务请求的统一管理,同时还支持WebSocket、HTTP请求转发、负载均衡等功能。 …

    其他 2023年3月28日
    00
  • Linux 服务器安全技巧

    Linux 服务器安全技巧攻略 保护 Linux 服务器安全对于企业来说非常重要。本文将介绍一些 Linux 服务器安全技巧,助您保护服务器免遭攻击。 更新系统 第一步是保证系统是最新的,这将修复系统漏洞、错误并提高安全性。可以使用以下命令更新系统: sudo apt update && sudo apt upgrade -y 禁用 root…

    other 2023年6月27日
    00
  • js捕获鼠标右键菜单中的粘帖事件实现代码

    下面是“JS捕获鼠标右键菜单中的粘贴事件实现代码”的详细攻略。 什么是鼠标右键菜单中的粘贴事件? 在鼠标右键菜单中,选择“粘贴”选项,可以将剪贴板中的内容粘贴到文本框或其他输入框中。鼠标右键菜单中的“粘贴”事件可以通过JavaScript来捕获和处理。 实现方法 要实现通过JavaScript捕获鼠标右键菜单中的“粘贴”事件,可以使用以下方法: 使用cont…

    other 2023年6月27日
    00
  • 从javascript调用dll方法

    以下是关于“从JavaScript调用DLL方法”的完整攻略,包括基本知识和两个示例。 基本知识 在Windows系统中,DLL(动态链接库)是一种可重用的代码库,其中包含可由多个程序共享的函数和数据。JavaScript可以通过ActiveX对象或COM对象来调用方法。 解决方案 以下是解决“从JavaScript调用DLL方法”的步骤: 创建DLL: 在…

    other 2023年5月7日
    00
  • 腾讯云服务器部署前后分离项目之前端部署

    下面我将详细讲解“腾讯云服务器部署前后分离项目之前端部署”的完整攻略,具体步骤如下: 准备工作 在腾讯云上购买一台云服务器,并开启相关服务。 安装Node.js和Git工具。 前端代码打包 安装前端依赖: bash npm install 执行前端代码打包命令: bash npm run build 执行完命令后,将会在项目根目录下生成一个dist文件夹,里…

    other 2023年6月27日
    00
  • 关于reactjs:何时使用react的“componentdidupdate”方法

    以下是关于“关于ReactJS:何时使用React的“componentDidUpdate”方法”的完整攻略,包含两个示例。 关于ReactJS:何时使用的“componentUpdate”方法 React是一个流行的JavaScript库,用于构建用户界面。在React中,我们可以使用“componentDidUpdate”方法处理组更新后的操作。以下是关…

    other 2023年5月9日
    00
  • Mac分区失败 未能修改分区图,因为文件系统验证失败该怎么解决?

    解决Mac分区失败的问题,首先需要了解该错误的原因。一般来说,Mac分区失败 未能修改分区图,因为文件系统验证失败的错误是由于文件系统出现了问题导致的。文件系统是一个非常重要的组成部分,它负责储存文件、访问权限和其他系统信息。一旦文件系统出现问题,就会导致分区失败错误。 下面是解决Mac分区失败的完整攻略: 步骤1:备份数据在进行任何分区操作之前,一定要备份…

    other 2023年6月27日
    00
  • Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡

    请见以下完整攻略: Android百度地图实现搜索和定位及自定义图标绘制并点击时弹出泡泡 一、前言 Android百度地图是一款非常强大的地图工具,它集成了很多常用的地图功能,包括地图展示、搜索、定位等,也可以通过开发者的自定义需求来定制地图的样式、交互和功能。其中,本文将介绍如何在Android中使用百度地图实现搜索和定位,并自定义绘制图标并点击时弹出泡泡…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部