Browse Source

修改多个下拉框共存时,下拉面板不自动关闭问题

pull/84/head
zq 2 days ago
parent
commit
8a344b663f
  1. 23
      src/components/CustomDropdown.vue
  2. 4
      src/components/SliderMenu.vue
  3. 3
      src/utils/eventBus.js

23
src/components/CustomDropdown.vue

@ -1,11 +1,13 @@
<template> <template>
<div class="custom-select" v-clickaway="closeDropdown" ref="dropdown" :class="{ 'is-open': isOpen }" :style="{width}"> <div class="custom-select" v-clickaway="closeDropdown" ref="dropdown" :class="{ 'is-open': isOpen }"
:style="{ width }">
<!-- 触发按钮 --> <!-- 触发按钮 -->
<div class="select-trigger" @click="toggleDropdown"> <div class="select-trigger" @click="toggleDropdown">
<slot name="trigger"> <slot name="trigger">
{{ selectedItem ? selectedItem[displayKey] : placeholder }} {{ selectedItem ? selectedItem[displayKey] : placeholder }}
</slot> </slot>
<img class="arrow-icon" :src="isOpen? require('../assets/dropDown_open.png'):require('../assets/dropDown_expand.png')" alt=""> <img class="arrow-icon"
:src="isOpen ? require('../assets/dropDown_open.png') : require('../assets/dropDown_expand.png')" alt="">
</div> </div>
<!-- 下拉内容 --> <!-- 下拉内容 -->
@ -15,7 +17,7 @@
<div v-if="options"> <div v-if="options">
<div v-for="(item, index) in options" :key="index" class="dropdown-item " <div v-for="(item, index) in options" :key="index" class="dropdown-item "
:class="{ 'is-selected': isSelected(item) }" @click="selectItem(item)"> :class="{ 'is-selected': isSelected(item) }" @click="selectItem(item)">
<slot name="item" :item="item" > <slot name="item" :item="item">
<div class="flex-between"> <div class="flex-between">
<div class="left"> <div class="left">
<p class="one">{{ item[displayKey] }}</p> <p class="one">{{ item[displayKey] }}</p>
@ -44,6 +46,7 @@
</template> </template>
<script> <script>
import { EventBus } from '@/utils/eventBus'
export default { export default {
props: { props: {
width: { width: {
@ -56,7 +59,7 @@ export default {
}, },
options_null: { options_null: {
type: Object, type: Object,
default: () => {}, default: () => { },
}, },
placeholder: { placeholder: {
type: String, type: String,
@ -89,14 +92,24 @@ export default {
}, },
}, },
}, },
created() {
//
EventBus.$on('close-all-dropdowns', this.closeDropdown)
},
beforeDestroy() {
//
EventBus.$off('close-all-dropdowns', this.closeDropdown)
},
methods: { methods: {
closeDropdown() { closeDropdown() {
this.isOpen = false; this.isOpen = false;
}, },
toggleDropdown(e) { toggleDropdown(e) {
if(e) { if (e) {
e.stopPropagation(); e.stopPropagation();
} }
//
EventBus.$emit('close-all-dropdowns')
this.isOpen = !this.isOpen; this.isOpen = !this.isOpen;
}, },
selectItem(item) { selectItem(item) {

4
src/components/SliderMenu.vue

@ -164,7 +164,7 @@ export default {
.title_text { .title_text {
margin-left: 4px; margin-left: 4px;
font-size: 12px; font-size: 14px;
font-weight: bold; font-weight: bold;
display: block; display: block;
@ -187,7 +187,7 @@ export default {
.el-menu-item { .el-menu-item {
padding: 0 22px; padding: 0 22px;
font-size: 12px; font-size: 14px;
} }
.menu-top { .menu-top {

3
src/utils/eventBus.js

@ -0,0 +1,3 @@
// 在项目中创建 eventBus.js
import Vue from 'vue'
export const EventBus = new Vue()
Loading…
Cancel
Save