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

yizhihongxing

下面是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日

相关文章

  • adbdevices找不到设备的解决方法

    简介 在使用Android Debug Bridge (ADB)连接Android设备时,有时会出现adb devices找不到设备的情况。在本攻略中,我们将介绍如何解决adb devices找不到设备的问题,并提两个示例说明。 步骤 以下是解决adb devices找不到设备的步骤。 步骤1:检查设备连接 首先,我们需要检查设备是否正确连接到计算机。我们可…

    other 2023年5月6日
    00
  • Shopee在React Native 架构方面的探索及发展历程

    Shopee在React Native 架构方面的探索及发展历程 背景 React Native是由Facebook推出的一种移动应用开发框架,旨在使用JavaScript和React来构建跨平台的移动应用程序。目前React Native在全球范围内拥有众多的支持者和使用者,其在移动开发领域十分流行。Shopee作为一家知名的电商公司,也深入研究和探索了R…

    other 2023年6月27日
    00
  • CSS加载失败原因的总结与分析

    以下是关于“CSS加载失败原因的总结与分析”的完整攻略。 1. 核对文件路径 首先检查CSS文件的路径是否正确,在写HTML页面时,需要保证CSS文件的路径是正确的。路径错误会导致CSS文件无法加载。在HTML代码中,CSS路径通常是通过相对路径或绝对路径表示。相对路径指的是相对于当前打开的HTML页面的路径。绝对路径则是指文件在服务器上的完整路径,通常以h…

    other 2023年6月25日
    00
  • Win10预览版19042.450怎么通过下载补丁KB4566782升级?

    下面我将为你详细讲解“Win10预览版19042.450怎么通过下载补丁KB4566782升级”的完整攻略。 1. 确认系统版本和补丁名称 首先,我们需要确认当前系统的版本是否为Win10预览版19042.450,以及需要下载的补丁名称是否为KB4566782。你可以按下“Win+R”组合键打开运行命令框,输入“winver”并按下回车键,查看系统版本号是否…

    other 2023年6月27日
    00
  • 使用python网络抓取google新闻

    使用Python网络抓取Google新闻是一项非常有用的技能,可以帮助您获取最新的新闻和信息。本文将提供一个完整的攻略,包括Python进行网络抓取的基本知识和两个示例说明。 基本知识 在使用Python进行网络抓取之前,您需要了解基本知识: 网络请求:使用Python发送HTTP请求来获取网页内容。 解析HTML:使用Python解析HTML文档,以便从中…

    other 2023年5月7日
    00
  • linux中的set-e与set-opipefail

    以下是“Linux中的set -e与set -o pipefail的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: Linux中的set -e与set -o pipefail的完整攻略 在Linux中,可以使用set -e和set -o pipefail命令来控制脚本的错误处理和管道命令的错误处理。以下是这两个命令的详细步骤: …

    other 2023年5月10日
    00
  • 详解C++之类和对象(2)

    详细讲解“详解C++之类和对象(2)”的完整攻略如下: 一、类和对象的概念 在C++中,一个类是一个抽象的数据类型,它由数据成员和函数成员组成。类的实例被称为对象。我们可以通过定义类来定义一个新的类型,然后使用该类型的对象来执行某些任务。 二、类和对象的定义 在C++中,定义一个类的语法如下: class class_name { private: data…

    other 2023年6月26日
    00
  • omi数据批量下载方法总结

    OMI数据批量下载方法总结 OMI(Observatoire Méditerranéen de l’Environnement)是一个地中海环境观测站,提供了大量的环境数据。本攻略将介绍如何使用OM站下载数据的方法,包括单个文件下载和批量下载。以下是OMI数据批量下载方法总结的完整攻略: 打开OMI网站 首先,需要打开OMI网站(http://www.omi…

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