Vue js Cómo cerrar el menú desplegable de bootstrap cuando se hace clic fuera del menú

Dec 18 2020

Estoy intentando cerrar el menú desplegable cuando el usuario hace clic fuera del menú desplegable

header_component.vue

<div class="dropdown d-inline-block">

    <a href="#" class="logo logo-dark">
        <a href="javascript:void(0);" class="Logo-plus" @click="toggleMainMenu()">+</a>
        <span class="logo-lg">
            <img src="" alt="" height="25" id="topnav_heading_image">
        </span>
    </a>

    <div class="dropdown-menu dropdown-menu-right" style="left: 0;right: auto;" v-bind:class="show_main_menu ? 'd-block' : ''">
        ..............
     </div>
 </div

lo que intenté hasta ahora es agregar addeventlistener al cuerpo al hacer clic y eliminarEventListener el evento al cerrar. El evento corporal no se activa. ¿Cómo agregar un evento al cuerpo al hacer clic?

    methods:{
        toggleMainMenu(){
            this.show_main_menu = !this.show_main_menu;
            this.show_sub_menu = false;
            this.setBodyClass();
        },
        openSubMenu(menu_key){

            let formData = new FormData();
            formData.append("access_token", window.settings.access_token);
            formData.append('menu_key',menu_key);

            this.show_main_menu = false;
            axios.post('/api/get_sub_menus', formData).then((response) => {
                
                if(response.is_sub_menu == 0){                        
                    window.location.href = response.route;
                }else{                        
                    
                    this.sub_menus = _.chunk(_.toArray(response.data.sub_menu), 3);
                    this.show_sub_menu = true;
                }

            });

        },
        setBodyClass() {
            var body = document.body;
            body.classList.toggle('open');
            if(this.show_main_menu){
                body.addEventListener('click', e => {
                this.toggleMainMenu;
              });
            } else {
                body.removeEventListener('click', e => {
                console.log('closed');
              });
            }
        }
       
    },

    directives: {
    "my-directive": {
      bind: function(el, binding) {
        alert('hello');
        this.el.addEventListener('click', e => {
            this.toggleMainMenu;
          });
      },
      unbind: function(el) {
        // Remove Event Listener
       this.el.removeEventListener('click', e => {
                console.log('closed');
        });
      }
    }

Intenté con directivas también, no funciona

<body class="container-fluid p-0" v-my-directive="1">\
<body

Respuestas

BLPraveen Dec 18 2020 at 00:08

Debajo del código como resuelto mi problema

    mounted(){
        document.addEventListener('click', this.close);
    },
    methods:{
        toggleMainMenu(){
            this.show_main_menu = !this.show_main_menu;
            this.show_sub_menu = false;
        },
        openSubMenu(menu_key){

            let formData = new FormData();
            formData.append("access_token", window.settings.access_token);
            formData.append('menu_key',menu_key);

            this.show_main_menu = false;
            axios.post('/api/get_sub_menus', formData).then((response) => {
                
                if(response.is_sub_menu == 0){                        
                    window.location.href = response.route;
                }else{                        
                    
                    this.sub_menus = _.chunk(_.toArray(response.data.sub_menu), 3);
                    this.show_sub_menu = true;
                }

            });

        },
        close (e) {
          if (!this.$el.contains(e.target)) {
            this.show_main_menu = false;
          }
        }            
       
    },
    beforeDestroy () {
        document.removeEventListener('click',this.close);
    },