Vue 2 emit没有运行方法,即使设置正确

kx1ctssn  于 2023-04-07  发布在  Vue.js
关注(0)|答案(2)|浏览(170)

我尝试从子Vue组件向其父Vue组件发出事件,我尝试使用this.$emit('collapsemenu')完成此操作。
当我试图从父事件v-on:collapsemenu="collapseMenuf($event)"中获取这个事件时,什么也没有发生。方法没有运行,但我确信子事件会发出这个事件。
我是不是错过了什么重要的东西?我试着在网上寻找类似的问题,但到目前为止没有任何效果。

导航栏(儿童)

<template>
  <div class="navbar">
    <div class="navbar-left">
      <svg
        @click="collapse_menu"
        xmlns="http://www.w3.org/2000/svg"
        class="hamburger"
        viewBox="0 0 20 20"
        fill="currentColor"
      >
        <path
          fill-rule="evenodd"
          d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z"
          clip-rule="evenodd"
        />
      </svg>
    </div>
    <div class="navbar-right"></div>
  </div>
</template>

<script>
export default {
  name: "Navbars",
  components: {},
  methods: {
    collapse_menu() {
      console.log("clicked");
      this.$emit("collapsemenu", "TRUE");
    },
  },
};
</script>

<style lang="scss" scoped>
.navbar {
  width: 100%;
  height: 70px;
  background: yellow;
  padding: 10px;

  &-left {
    width: 50%;
  }
}

.hamburger {
  cursor: pointer;
  height: 30px;
}
</style>

主要

<template>
  <div class="dashboard h-screen bg-red-200">
    <Menu class="menu"></Menu>

    <div class="content">
      <Navbar v-on:collapsemenu="collapseMenuf($event)"></Navbar>
    </div>
    <!-- <Content></Content> -->
  </div>
</template>

<script>
import Navbar from "../../components/dashboard/navbar.vue";
import Menu from "../../components/dashboard/menu.vue";
export default {
  name: "Dash-main",
  components: { Navbar, Menu },
  data() {
    return {
      collapse: false,
    };
  },
  methods: {
    collapseMenuf(value) {
      console.log("fsd");
      this.collapse = value;
      console.log(value);
    },
  },
};
</script>

<style lang="scss" scoped>
.dashboard {
  display: flex;
  width: 100%;
}

.content {
  width: 100%;
}
</style>
lkaoscv7

lkaoscv71#

在父组件中,您应该按以下方式执行此操作:

<Navbar v-on:collapsemenu="collapseMenuf"></Navbar>

子组件:

<svg
    @click="collapse_menu($event)"
    xmlns="http://www.w3.org/2000/svg"
    class="hamburger"
    viewBox="0 0 20 20"
    fill="currentColor"
  >

在函数中访问$event,如下所示:

const collapse_menu = (e) => {
  console.log(e);
  emit('click', e.target);
};

你可以在这里找到更多关于vue emits的信息

hgb9j2n6

hgb9j2n62#

这有点令人困惑。我也遇到过同样的问题。虽然vue.js-v2的文档说这些

// on child component
this.$emit('event-name')
// on parent template
<child-component-name v-on:event-name="parent-method"></child-component-name>

应该有用但不幸的是没有
我是这样解决我的问题的:

// on child component
this.$root.$emit('saveSettings', this.apiRequestSetupObj);
// in parent component add this on mount
const thisInstance = this
this.$on('saveSettings', function (data) {
         thisInstance.saveSettings(data);
});

所以你可以试试这个。
注意:如果你想知道this.$emit与this.$root.$emit之间的区别,请检查以下问题:this.$emit vs. this.$root.$emit, best practice in vuejs

相关问题