Отключить v-меню, когда нет элемента

#vue.js #vuetify.js

#vue.js #vuetify.js

Вопрос:

У меня есть vuetify v-меню с условным элементом :

                    <v-menu min-width="225">                       
                        <template v-slot:activator="scope">
                            <v-btn small text color="primary" v-on="scope.on" :loading="actionLoading">
                                <v-icon>mdi-dots-vertical</v-icon>
                            </v-btn>
                        </template>
                        <v-list dense>
                            <v-list-item-group color="primary">
                                <v-list-item v-if="itemOneCondition()" @click="doSomething()">
                                    <v-list-item-content>
                                        <v-list-item-title>
                                            Item 1
                                        </v-list-item-title>
                                    </v-list-item-content>
                                </v-list-item>
                                <v-list-item v-if="itemTwoCondition()" @click="something()">
                                    <v-list-item-content>
                                        <v-list-item-title>
                                            Title 2
                                        </v-list-item-title>
                                    </v-list-item-content>
                                </v-list-item>
                            </v-list>
                        </v-list-item-group>                           
                    </v-menu>
  

Бывает, что что-то каждый элемент не виден (каждое условие v-if равно false). Таким образом, в меню нет ни одного элемента.

В этом cas кнопка по-прежнему активна, и меню открывается без ввода :

введите описание изображения здесь

Есть ли способ отключить кнопку, когда элемент не виден?

Ответ №1:

Вам нужно условие v-if для всего меню, например

 <v-menu v-if="menuitems.length > 0" min-width="225">  </v-menu>
  

Если нет пунктов меню или массив элементов меню.длина равна 0, панель меню отображаться не будет

Извлеките этот фрагмент кода, вам нужно сохранить пункты меню в массиве, чтобы это работало. В приведенном ниже фрагменте кода при замене items: ["Item1","Item2",] на items: []

Обратите внимание, что меню с черным фоном не будет отображаться

 var app = new Vue({
  el: "#menu",
  data () {
    return {
      items: [
        "Item1",
        "Item2",
      ]
    }
  }
})  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

<div class="menu" id="menu">

  <ul style="background: black; color: yellow" v-if="items.length > 0">
     <li v-for="(item, index) in items" :key="index">{{item}}</li>
  </ul>
</div>  

Комментарии:

1. это не работает, меню не отображается, даже если в меню есть элемент

2. Я отредактировал ответ выше.. Посмотрите, решит ли это вашу проблему сейчас

Ответ №2:

Я использовал это решение, добавив isAtLeastOneItemDisplayed() функцию :

 <v-menu v-if="isAtLeastOneItemDisplayed()" min-width="225">                       
                        <template v-slot:activator="scope">
                            <v-btn small text color="primary" v-on="scope.on" :loading="actionLoading">
                                <v-icon>mdi-dots-vertical</v-icon>
                            </v-btn>
                        </template>
                        <v-list dense>
                            <v-list-item-group color="primary">
                                <v-list-item v-if="itemOneCondition()" @click="doSomething()">
                                    <v-list-item-content>
                                        <v-list-item-title>
                                            Item 1
                                        </v-list-item-title>
                                    </v-list-item-content>
                                </v-list-item>
                                <v-list-item v-if="itemTwoCondition()" @click="something()">
                                    <v-list-item-content>
                                        <v-list-item-title>
                                            Title 2
                                        </v-list-item-title>
                                    </v-list-item-content>
                                </v-list-item>
                            </v-list>
                        </v-list-item-group>                           
                    </v-menu>

isAtLeastOneItemDisplayed : function(){
            return this.itemOneCondition()
                || this.itemTwoCondition();
}