javascript - 如何在 v-app 外部单击时关闭 v-select?

标签 javascript vue.js vuetify.js

我有一个用户 vuetify 的 vue 应用程序。该应用程序在现有的 cms 中使用。
打开下拉选择时,在应用程序外部单击不会关闭下拉列表。如果单击在应用程序区域内,则下拉菜单将关闭。

知道如何在应用程序外部单击打开的下拉菜单时触发关闭吗?

new Vue({
  el: '#cartbutton',
  data() {
    return {
      items: [{text:'a'}, {text:'b'}]
    }
  }
})
.existing-cms {
  padding: 40px 50px;
}

#app {
  background-color: rgba(0,0,0,0.2);
  padding: 10px;
  height: 200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet"/>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Material+Icons" rel=stylesheet>

<div class="existing-cms">
  <p>Click on the select dropdown and leave it open.</p>
  <p>
    Click on this white region outside the app should somehow close
    opened select in the app.
  </p>
  
  <div id="cartbutton">
    <v-app>
      <span>Clicking here insde the app closed the opened select</span>
      <br><br>
      <v-select label="Click me and leave it opened. Then click in the white region." :items="items"></v-select>
    </v-app>
  </div>
  
</div>


这是一个codepen链接https://codepen.io/darkopetreski/pen/OGMvop

编辑:

似乎这被报告为此处的错误 https://github.com/vuetifyjs/vuetify/issues/3144并且建议是在根元素上使用 data-app="true",但是这种方法不好,因为它会弄乱一些东西(至少对我来说效果不佳)。

最佳答案

这是一个相当老套的解决方案,但它似乎有效。有两个变化:

1) 添加一个窗口点击监听器,在 v-select 上调用 blur 方法。这隐藏了控件。为了方便起见,我向 v-select 组件添加了一个 ref。

2) 为了防止当他们在应用程序内部或 v-select 上单击时触发此事件,我在容器上添加了一个停止传播 @click.stop。

https://codepen.io/anon/pen/BeoOMz

new Vue({
  el: '#cartbutton',
  data() {
    return {
      items: [{text:'a'}, {text:'b'}]
    }
  },
  mounted() {
    window.addEventListener("click",() => {
       this.$refs.select.blur();
    });    
  }
})
.existing-cms {
  padding: 40px 50px;
}

#app {
  background-color: rgba(0,0,0,0.2);
  padding: 10px;
  height: 200px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<link href="https://unpkg.com/vuetify/dist/vuetify.min.css" rel="stylesheet"/>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<link href="https://fonts.googleapis.com/css?family=Material+Icons" rel=stylesheet>

<div class="existing-cms">
  <p>Click on the select dropdown and leave it open.</p>
  <p>
    Click on this white region outside the app should somehow close
    opened select in the app.
  </p>
  
  <div id="cartbutton" @click.stop>
    <v-app>
      <span>Clicking here insde the app closed the opened select</span>
      <br><br>
      <v-select ref="select" label="Click me and leave it opened. Then click in the white region." :items="items"></v-select>
    </v-app>
  </div>
  
</div>

关于javascript - 如何在 v-app 外部单击时关闭 v-select?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56047270/

相关文章:

javascript - JS 覆盖菜单不显示

vue.js - 如何将 BootstrapVue 中的 Prop 传递给路由器链接

javascript - 如何处理使用 v-on :change? 隐藏的输入

javascript - 弹出窗口中的 Tinymce 插入/编辑图像字段在 vuetify 的对话框中不可编辑(聚焦)

vue.js - 使用 vue.js 和 vuetify 进行服务器端表单验证

vue.js - 提交或关闭对话框后清除对话框表单的最佳方法

javascript - 如何从下面的代码中获取变量a的值?

javascript - 将reduce() 与+ 运算符一起使用的最简洁方法是什么?

javascript - 如何将 Promise 与生成器一起使用?

vue.js - 动态注册一个 Vuex 插件?