Vue.js 中制作自定义选择组件的代码附演示demo


Posted in Javascript onFebruary 28, 2020

Vue.js 中制作自定义选择组件的代码附演示demo 

定制 select 标签的设计非常困难。有时候,如果不使用样式化的 div 和自定义 JavaScript 的结合来构建自己的脚本,那是不可能的。在本文中,你将学习如何构建使用完全自定义 CSS 设置样式的 Vue.js 组件。

Vue.js 中制作自定义选择组件的代码附演示demo 

Demo: https://codesandbox.io/s/custom-vuejs-select-component-8nqgd

HTML

<template>
 <div
 class="custom-select"
  :tabindex="tabindex"
  @blur="open = false"
 >
  <div
  class="selected"
  :class="{open: open}"
  @click="open = !open"
 >
  {{ selected }}
 </div>
 <div
  class="items"
  :class="{selectHide: !open}"
 >
  <div
  class="item"
  v-for="(option, i) of options"
  :key="i"
  @click="selected=option; open=false; $emit('input', option)"
  >
  {{ option }}
  </div>
 </div>
 </div>
</template>

需要注意以下几点:

  • tabindex 属性使我们的组件能够得到焦点,从而使它变得模糊。当用户在组件外部单击时, blur 事件将关闭我们的组件。
  • input 参数发出选定的选项,父组件可以轻松地对更改做出反应。

JavaScript

<script>
 export default {
 props:{
  options:{
  type: Array,
  required: true
  },
  tabindex:{
  type: Number,
  required: false,
  default: 0
 }
 },
 data() {
 return {
  selected: this.options.length > 0 ? this.options[0] : null,
  open: false
 };
 },
 mounted(){
 this.$emit('input', this.selected);
 }
};
</script>

另外,要注意的重要事项:

我们还会在 mount 上发出选定的值,以便父级不需要显式设置默认值。如果我们的 select 组件是较大表单的一部分,那么我们希望能够设置正确的 tabindex 。

CSS

<style scoped>
 .custom-select {
 position: relative;
 width: 100%;
 text-align: left;
 outline: none;
 height: 47px;
 line-height: 47px;
}

.selected {
 background-color: #080D0E;
 border-radius: 6px;
 border: 1px solid #858586;
 color: #ffffff;
 padding-left: 8px;
 cursor: pointer;
 user-select: none;
}

.selected.open{
 border: 1px solid #CE9B2C;
 border-radius: 6px 6px 0px 0px;
}

.selected:after {
 position: absolute;
 content: "";
 top: 22px;
 right: 10px;
 width: 0;
 height: 0;
 border: 4px solid transparent;
 border-color: #fff transparent transparent transparent;
}

.items {
 color: #ffffff;
 border-radius: 0px 0px 6px 6px;
 overflow: hidden;
 border-right: 1px solid #CE9B2C;
 border-left: 1px solid #CE9B2C;
 border-bottom: 1px solid #CE9B2C;
 position: absolute;
 background-color: #080D0E;
 left: 0;
 right: 0;
}

.item{
 color: #ffffff;
 padding-left: 8px;
 cursor: pointer;
 user-select: none;
}

.item:hover{
 background-color: #B68A28;
}

.selectHide {
 display: none;
}
</style>

该 CSS只是一个示例,你可以按照你的需求随意修改样式。

我希望这可以帮助你创建自己的自定义选择组件,以下是完整组件要点的链接:

最后,在线演示的示例:https://codesandbox.io/s/custom-vuejs-select-component-8nqgd

总结

到此这篇关于Vue.js 中制作自定义选择组件的代码附演示demo的文章就介绍到这了,更多相关vuejs自定义选择组件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ie和firefox中img对象区别的困惑
Dec 27 Javascript
初识JQuery 实例一(first)
Mar 16 Javascript
JQuery的Ajax跨域请求原理概述及实例
Apr 26 Javascript
js获取select标签的值且兼容IE与firefox
Dec 30 Javascript
jQuery经过一段时间自动隐藏指定元素的方法
Mar 17 Javascript
fullpage.js全屏滚动插件使用实例
Sep 06 Javascript
关于vue-resource报错450的解决方案
Jul 24 Javascript
vue单页应用中如何使用jquery的方法示例
Jul 27 jQuery
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
Sep 22 jQuery
基于jquery实现的tab选项卡功能示例【附源码下载】
Jun 10 jQuery
vue props 单项数据流实例分享
Feb 16 Javascript
Vue.js原理分析之nextTick实现详解
Sep 07 Javascript
使用vue-cli3+typescript的项目模板创建工程的教程
Feb 28 #Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
Feb 28 #Javascript
vue 中的 render 函数作用详解
Feb 28 #Javascript
微信小程序动态添加和删除组件的现实
Feb 28 #Javascript
浅析Vue 中的 render 函数
Feb 28 #Javascript
微信小程序实现录制、试听、上传音频功能(带波形图)
Feb 27 #Javascript
基于Element的组件改造的树形选择器(树形下拉框)
Feb 27 #Javascript
You might like
php5中date()得出的时间为什么不是当前时间的解决方法
2008/06/30 PHP
PHP中其实也可以用方法链
2011/11/10 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
php tpl模板引擎定义与使用示例
2019/08/09 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
jq实现酷炫的鼠标经过图片翻滚效果
2014/03/12 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
[38:30]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场2
2014/05/24 DOTA
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
python实现n个数中选出m个数的方法
2018/11/13 Python
Flask框架web开发之零基础入门
2018/12/10 Python
pandas.cut具体使用总结
2019/06/24 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
美国运动鞋和运动服零售商:Footaction
2017/04/07 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
气象学专业个人求职信
2014/03/15 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
群众路线个人剖析材料及整改措施
2014/11/04 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
黑白记忆观后感
2015/06/18 职场文书
教师节领导致辞
2015/07/29 职场文书
关于Python中*args和**kwargs的深入理解
2021/08/07 Python