【问题标题】:How to close v-select on click outside v-app?如何在 v-app 外部单击时关闭 v-select?
【发布时间】:2019-09-26 13:44:45
【问题描述】:

我有一个用户 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" ,但这种方法不好,因为它会弄乱一些东西(至少对我来说效果不佳)。

【问题讨论】:

    标签: javascript vue.js vuetify.js


    【解决方案1】:

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

    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>

    【讨论】:

    • 我找到了另一种方法,在我编辑问题时将 data-app="true" 添加到 cms 的 body 元素中,但是这种方法会给我的 cms 带来一些麻烦。所以现在最安全的方法是作为你添加事件监听器的方法。
    • @jcbdrn 这还在工作吗?对于我的场景,模糊不起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多