使用vue来开发一个下拉菜单组件(1)

一、新建demo工程

vue init webpack-simple demo

添加src/mixins/emitter.js文件(见前几篇博文)

安装font-awesome字体库:

cnpm install font-awesome --save

配置webpack.config.js,引入字体文件:

{
  test: /\.(otf|eot|ttf|woff|woff2)$/,
  loader: ‘file-loader‘
}

在src/main.js中引入font-awesome:

import ‘../node_modules/font-awesome/css/font-awesome.min.css‘

二、组件设计

新建src/components/mySelect.vue和myOption.vue文件

1) 先来设计选项组件,这个比较简单

先来考虑一下使用场景,一般的下拉菜单都是由无序列表组成,而选项则是一个个列表项:

但是直接slot标签很可能会出现重名,所以需要分别prop一个label和value,其中value是必须的,如果没有slot标签则显示label,所以myOption的基本结构为:

<template>
  <li class="my-option">
    <span v-if="!$slots.default">{{ label }}</span>
    <slot></slot>
  </li>
</template>

<script>
import emitter from "../mixins/emitter";

export default {
  name: "myOption",
  mixins: [emitter],
  props: {
    label: {
      type: String,
      default: "empty-label"
    },
    value: {
      type: String,
      required: true
    }
  }
};
</script>

然后来考虑一下myOption可能会存在的状态,选项有选择和取消两种事件,对应的状态就是是否已经被选择,而且选择的状态需要高亮显示:

先来加一个状态:

data() {
  return {
    selected: true
  }
}

然后在最外层的li添加一个selected类名和一个右浮的check图标(可以用v-show="selected"来控制显示,我这里用css与文字颜色一起控制):

<template>
  <li :class="[‘my-option‘, { selected: selected }]">
    <span v-if="!$slots.default">{{ label ? label : value }}</span>
    <slot></slot>
    <i class="fa fa-check pull-right">&nbsp;</i>
  </li>
</template>

css代码:

<style lang="scss" scoped>
.my-option {
  > .fa-check {
    display: none;
  }
  &.selected {
    color: blue;
    > .fa-check {
      display: inline;
    }
  }
}
</style>

由于父组件select需要接收label的值,而prop不能改变,只好再定义一个myLabel标签,然后通过事件发送给父级:

myLabel: this.label || this.value

先后添加点击事件和监听的选择/取消事件:

methods: {
  handleClick() {
    this.dispatch(
      "mySelect",
      "option-click",
      this.selected,
      this.myLabel,
      this.value
    );
  }
},
created() {
  this.$on("select", value => {
    if (this.value === value) {
      this.selected = true;
    }
  });
  this.$on("cancel", value => {
    if (this.value === value) {
      this.selected = false;
    }
  });
}

然后,不带样式的选项组件基本就完成了,完整代码如下:

<template>
  <li :class="[‘my-option‘, { selected: selected }]">
    <span v-if="!$slots.default">{{ myLabel }}</span>
    <slot></slot>
    <i class="fa fa-check pull-right">&nbsp;</i>
  </li>
</template>

<script>
import emitter from "../mixins/emitter";

export default {
  name: "myOption",
  mixins: [emitter],
  props: {
    label: {
      type: String,
      default: ""
    },
    value: {
      type: String,
      required: true
    }
  },
  data() {
    return {
      selected: false,
      myLabel: this.label || this.value
    };
  },
  methods: {
    handleClick() {
      this.dispatch(
        "mySelect",
        "option-click",
        this.selected,
        this.myLabel,
        this.value
      );
    }
  },
  created() {
    this.$on("select", value => {
      if (this.value === value) {
        this.selected = true;
      }
    });
    this.$on("cancel", value => {
      if (this.value === value) {
        this.selected = false;
      }
    });
  }
};
</script>

<style lang="scss" scoped>
.my-option {
  > .fa-check {
    display: none;
  }
  &.selected {
    color: blue;
    > .fa-check {
      display: inline;
    }
  }
}
</style>

原文地址:https://www.cnblogs.com/viewts/p/11417384.html

时间: 2024-08-29 18:22:22

使用vue来开发一个下拉菜单组件(1)的相关文章

vue的jsonp百度下拉菜单

通过vue的jsonp实现百度下拉菜单的请求,vue的版本是2.9.2 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <script src="vue.min.js"></script> 7 <scri

《精通CSS》一个下拉菜单的例子

这个例子是下拉菜单的,我进行了一点点改动,原理的确很简单,但是作者的代码层次感很清楚,值得学习:另外一点,作者在交互过程中的颜色变化,甚至精确到边框线之间的变化,虽然从旁观者的角度看基本上看不出来这个有什么变化,但是这种细致入微的思考和设计是值得学习和思考的,所谓细微之处方见技艺是否成熟,我觉得这是有道理的!不说了,上代码: 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://

n级联动下拉菜单组件

这是最近在写的一套前端库中的一个组件,支持n级联动的下拉菜单,在这里跟大家分享一下. 使用方法如下: <div id="test"> <p>省份:<select></select></p> <p>城市:<select></select></p> <p>商家:<select></select></p> </div> <

一个下拉菜单的实例

<!DOCTYPE html> <html ng-app="myApp"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>RunJS</title> <style> button{ border:1px solid #ccc; cursor:poi

基于Bootstrap实现下图所示效果的页面,一个白底的带有两个菜单项、一个下拉菜单和一个登录表单的基本导航条

1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="widt

Element-UI ( Dropdow )下拉菜单组件command传输对象

通过 :command绑定对象数据,handleCommand方法处理数据 template <div v-for="(item, index) in FlyWarningList" :key="index"> <div :class="[isActive === item.isRead ? '':' warning-content', 'first-content']" v-if="item.infoType ===

通用无限极下拉菜单

下拉菜单在我开发中经常遇到,但是没个项目都需要从新编写,改起来虽然简单但是很麻烦,我这个人还是比较懒的,今天有时间把我以前的项目开发中的菜单整理一遍,编写一个通用版本,以后就不需要那么麻烦了. 特点 今天整理的菜单是由jquery+css开发有如下特点: 一.通用性强 以前在用的一个下拉菜单有个问题,需要对主导航和子菜单进行单独的设置,比如,二级菜单是class="first_menu",三级菜单是class="second_menu"....依次类推,这样的写法有

Mega Dropdown - 带子分类的响应式下拉菜单

当你在开发一个内容很多的 Web 项目的时候,最具挑战性的部分之一是为了如果更方便用户浏览这些内容.我们都能想到的一个例子是 Amazon,无限的类别以及它们的子类别.Mega Dropdown 是带二级分类的响应式下拉菜单组件,简单易用. 在线演示      源码下载 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的10个效果[源码下载] 1

安卓微信中bootstrap下拉菜单无法正常工作的解决方案

bootstrap下拉菜单组件描述:http://v3.bootcss.com/components/#dropdowns 问题环境:安卓4.4.2,微信6.2内置浏览器,bootstrap 3.1.1.1 问题描述:bootstrapV3的下拉菜单组件,在ios的微信浏览器中表现正常,但安卓微信浏览器中无法正常触发,安卓非微信浏览器可以触发 问题触发条件:未知 解决方案:去除button元素的属性data-toggle="dropdown",自己另外写一小段事件监听代码来切换div.