vue.js - 在 vuejs 中打开/关闭模式时如何在 body 标签上添加/删除类

标签 vue.js vuejs2

我的一个页面中有一个模式,我想在打开模式时在主体上添加一个“active”类,这样我就可以隐藏主体溢出(无滚动)。 当我从一个组件单击时,有没有一种方法可以在 body 标记上切换类?我想不通...

我使用路线

<template>
    <div id="app">
        <Header />
        <router-view/>
        <Footer />
    </div>
</template>

提前致谢

最佳答案

在 Vue 中执行此操作的正确方法是在组件之间进行通信,在这种情况下,它可能不是简单的父/子通信,因此您可能需要创建一个事件总线。

通过使用这种方法,模式的代码对应用程序的其余部分的影响最小,它只调度您可以从任何其他组件订阅的事件。

注意: 在这种情况下,您不会将类添加到 body 标记上(因为您无法将 Vue 安装到 body 上),但您可以将其添加到根 div 中以获取类似的结果。

const eventBus = new Vue();

Vue.component('modal', {
  props: ['isOpen'],
  template: `
  	<div class="modal" v-if="isOpen">This is a modal</div>
  `,
});

Vue.component('wrapper', {
  template: `
    <div>
      <modal :isOpen="isModalOpen"></modal>
      <button @click="toggleModal">toggle modal</button>
    </div>
  `,
  data() {
    return {
      isModalOpen: false,
    }
  },
  methods: {
    toggleModal() {
      this.isModalOpen = !this.isModalOpen;
      eventBus.$emit('toggleModal', this.isModalOpen);
    }
  }
});

new Vue({
  el: "#app",
  data: {
    active: false,
  },
  created() {
    eventBus.$on('toggleModal', (isModalOpen) => {
      this.active = isModalOpen;
    });
  },
})
.active {
  background: grey;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.16/vue.min.js"></script>
<div id="app" :class="{active}">
  <wrapper></wrapper>
</div>

关于vue.js - 在 vuejs 中打开/关闭模式时如何在 body 标签上添加/删除类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50327241/

相关文章:

vue.js - 视觉 : how to make the object passed to component reactive?

javascript - 我的自定义 ShopWare 6 Javascript 插件中未定义“Vue”

vue.js - 无法访问输入事件的 keyCode/key 事件

vue.js - DisabledForUser 请确保运行 npm run dev 时应用程序 ID 设置正确?

javascript - Vuejs如何按多个元素进行过滤

javascript - 对 index.php 的一个请求暂停其他请求直至完成

HTML、CSS : Make table vertically scrollable

javascript - 如何测试从 VueX 观察计算属性的 Vue 观察者?

javascript - Vue 路由器将 url 附加到当前 url

vue.js - 访问 Vue3 全局组件