Vue下拉菜单组件化开发详解

 更新时间:2021年09月27日 09:17:40   作者:Hgiao  
这篇文章主要为大家详细介绍了Vue下拉菜单组件化开发过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Vue下拉菜单组件化开发的具体代码,供大家参考,具体内容如下

搞一个自定义组件,只是一个很简单的下拉菜单,也就是一个思路,整起

第一步:在项目中专门创建一个放置自定义组件的文件夹(直接components底下的common中)

dropdown.vue 为一级盒子

dropdownMenu.vue 为二级盒子

dropdownItem.vue 为二级盒子内容

第二步 :

对dropdown.vue的操作

<template>
  <div class="box">
     <!-- 给按钮加点击事件  -->
    <div @click="showM">
          <!-- 一级按钮  -->
      <slot name="title"></slot>
    </div>
        <!--  二级盒子  -->
        
        <!--  加v-if操作 隐藏显示效果 -->
    <slot v-if="show" name="dropdown"></slot>
  </div>
</template>

<script>
  export default {
    name: "dropdown",
    data() {
      return {
        // 默认二级盒子关闭
        show: false
      }
    },
    methods: {
      showM() {
        this.show = !this.show
      },
      commitClick(value) {
      // 向父级暴露dropdown事件,并把值传入
        this.$emit('change-item',value)
      }
    }
  }
</script>

<style scoped>
  .box {
    display: inline-block; /* 行内块 */
    position: relative; /* 相对定位 */
    top:100px;
    margin-left:100px
  }
</style>

对于dropdownMenu仅仅只是把它当作一个盒子,只需要添加一个插槽,把盒子搭好即可

<template>
  <div class="dropdown-menu">
    <slot></slot>
  </div>
</template>

<script>
  export default {
    name: "dropdownMenu"
  }
</script>

<style scoped>
  .dropdown-menu {
    padding: 8px 0; /* 盒子内边距上下为8px 左右为0 */
    border-radius: 4px;  /* 盒子圆角 */
    border: 1px solid #f2f6fc;  /* 边框为1px 灰色 */
    position: absolute;  /* 绝对定位 */
    right: 0;   /* 在右侧 */
    top: 110%; /* 盒子在按钮下方 */
    background-color: #fff;  /* 背景颜色为白色 */
    box-shadow: 0 2px 4px rgba(0,0,0,0.12),0 0 6px rgba(0,0,0,.04);
    /* 为盒子添加阴影 */
  }
</style>

对dropdownItem的操作

<template>
  <div class="dropdown-item" @click="itemClick(value)">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: "dropdownItem",
  props:['value'],
  data() {
    return {};
  },
  methods: {
    itemClick(value) {
      // console.log(value)
      //通过this调用当前组件的父级的父级也就是dropdown的showM()方法来进行关闭
      this.$parent.$parent.showM();
      // 调用父级的父级(dropdown)的commitClick方法并传如value值
      this.$parent.$parent.commitClick(value);
    },
  },
};
</script>

<style scoped>
 .dropdown-item {
   line-height: 40px; /* 行高40px */
   white-space: nowrap;  /* 不换行 */
   padding: 0 20px; /* 内边距上下为0 左右为20px */
   color: #606266; /* 字体颜色为灰色 */
   cursor: pointer;  /* 鼠标移入为点击样子 */
 }
  .dropdown-item:hover {
    color: #409eff; /* 字体颜色为蓝色 */
    background-color: #ecf5ff; /* 背景颜色为 浅~~蓝色 非常浅就对了 */
  }
</style>

接下来对App.vue文件进行操作

<template>
  <div id="app">
    <dropdown @change-item="changeItem">
      <button slot="title">按钮</button>
      <dropdown-menu slot="dropdown">
        <dropdown-item value="吃的">吃的</dropdown-item>
        <dropdown-item value="喝的">喝的</dropdown-item>
        <dropdown-item value="玩的">玩的</dropdown-item>
      </dropdown-menu>
    </dropdown>
  </div>
</template>

<script>
  import dropdown from './components/common/dropdown'
  import dropdownMenu from "./components/common/dropdownMenu";
  import dropdownItem from "./components/common/dropdownItem";
  export default {
    name: 'App',
    components: {
      dropdown,dropdownMenu,dropdownItem
    },
    methods:{
      changeItem(e){
        console.log(e)
      }

    }
  }
</script>

在main.js导入组件

import zgDropdown from "@/components/common/dropdown"
import zgDropdownMenu from "@/components/common/dropdownMenu"
import zgDropdownItem from "@/components/common/dropdownItem"
Vue.component('zgDropdownItem',zgDropdownItem)
Vue.component('zgDropdown',zgDropdown)
Vue.component('zgDropdownMenu',zgDropdownMenu)

app.vue也要相应修改

<template>
  <div id="app">
    <zg-dropdown @change-item="changeItem">
      <button slot="title">按钮</button>
      <zg-dropdown-menu slot="dropdown">
        <zg-dropdown-item value="吃的">吃的</zg-dropdown-item>
        <zg-dropdown-item value="喝的">喝的</zg-dropdown-item>
        <zg-dropdown-item value="玩的">玩的</zg-dropdown-item>
      </zg-dropdown-menu>
    </zg-dropdown>
  </div>
</template>

<script>
  export default {
    name: 'App',
    methods:{
      changeItem(e){
        console.log(e)
      }

    }
  }
</script>
<style scoped>

</style>

大概就是这么一个思路。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Vue2.X和Vue3.0数据响应原理变化的区别

    Vue2.X和Vue3.0数据响应原理变化的区别

    这篇文章主要介绍了Vue2.X和Vue3.0数据响应原理变化的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • element ui From表单校验不生效问题解决

    element ui From表单校验不生效问题解决

    表单校验是注册环节中必不可少的操作,表单校验可以提醒用户填写数据规则以确保用户提交数据的有效性,本文主要介绍了element ui From表单校验不生效问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 基于vue2.0动态组件及render详解

    基于vue2.0动态组件及render详解

    下面小编就为大家分享一篇基于vue2.0动态组件及render详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • vue中element-ui使用axios上传文件

    vue中element-ui使用axios上传文件

    这篇文章主要为大家详细介绍了vue中element-ui使用axios上传文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • vue项目打包之后生成一个可修改IP地址的文件(具体操作)

    vue项目打包之后生成一个可修改IP地址的文件(具体操作)

    这篇文章主要介绍了vue项目打包之后生成一个可修改IP地址的文件(具体操作),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 手把手教你Vue-cli项目的搭建

    手把手教你Vue-cli项目的搭建

    这篇文章主要为大家详细介绍了Vue-cli项目的搭建方法,文中图片介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • vue如何将字符串变为数组

    vue如何将字符串变为数组

    这篇文章主要介绍了vue如何将字符串变为数组问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 在vue中实现低代码组件参数配置的流程步骤

    在vue中实现低代码组件参数配置的流程步骤

    这篇文章主要介绍了在vue中实现低代码组件参数配置的流程步骤,文中的代码示例讲解的非常详细,对我们的学习或工作有一定的参考价值,需要的朋友可以参考下
    2023-07-07
  • Vue3 封装 element-plus 图标选择器实现步骤

    Vue3 封装 element-plus 图标选择器实现步骤

    这篇文章主要介绍了Vue3 封装 element-plus 图标选择器,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 用vuex写了一个购物车H5页面的示例代码

    用vuex写了一个购物车H5页面的示例代码

    本篇文章主要介绍了用vuex写了一个购物车H5页面的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论