Vuejs 3 испускает событие от дочернего к родительскому компоненту

Недавно я начал работать с VueJS, я использую v3 и, похоже, у меня проблема с вызовом метода для родителя. Функция emit в дочернем элементе, похоже, не генерирует событие, и в родительском элементе ничего не происходит.

Я включил родителя и ребенка, чтобы показать, как я его настроил

Родитель

<template>
  <First/>
  < Child v-bind:sample="sample" @enlarge-text="onEnlargeText"/>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import axios from 'axios';
import First from './First.vue';
import Child from './Child.vue';

export default defineComponent({
  name: 'Container',
  components: {
    First,
    Child,
  },
  methods: {
    onEnlargeText() {
      console.log('enlargeText');
    },
  },
  data: () => ({
    sample: [],
    parentmessage: '',
  }),
  created() {
    axios.get('http://localhost:8080/getData')
      .then((response) => {
        console.log(response);
        this.sample = response.data;
      })
      .catch((error) => {
        console.log(error);
      });
  },
});
</script>

Ребенок

<template>
  <div id="add">
    <form id="signup-form" @submit.prevent="submit">
      <label for="text">Text:</label>
      <input type="text" v-model="text" required>
      <p class="error" >{{ error }}</p>
      <div class="field has-text-right">
        <button type="submit" class="button is-danger">Submit</button>
      </div>
    </form>
    <button v-on:click="tryThis">
      Enlarge text
    </button>
</div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';
import axios from 'axios';

interface SampleInterface {
  text: string;
  error: string;
}

export default defineComponent({
  name: 'Add',
  data: (): AddInterface => ({
    text: '',
    error: '',
  }),
  methods: {
    tryThis() {
      this.$emit('enlarge-text');
    },
    submit() {
      this.$emit('enlarge-text');
    },
  },
});
</script>

Как это сделать? Я что-то пропустил?

Мне было интересно, могу ли я использовать здесь $ emit?


person Keith Darragh    schedule 30.10.2020    source источник
comment
у вас есть ошибки в консоли?   -  person Boussadjra Brahim    schedule 30.10.2020
comment
@BoussadjraBrahim, к сожалению, в консоли ошибок не появляется   -  person Keith Darragh    schedule 30.10.2020
comment
не могли бы вы дополнить этот пример в этом коде ваш код для его отладки   -  person Boussadjra Brahim    schedule 30.10.2020
comment
Я обогатил пример. Теперь он содержит контейнер с кнопкой. Затем, когда вы нажимаете кнопку, он должен вывести логлайн для события, полученного в родительском контейнере. Codesandbox: codeandbox.io/s/vue-3-ts-forked-gnlen < / а>   -  person Keith Darragh    schedule 30.10.2020
comment
Хорошо, дай мне время отладить это   -  person Boussadjra Brahim    schedule 30.10.2020


Ответы (1)


Вам следует добавить новый emits option, содержащий имена сгенерированных событий:

ребенок :

<template>
  <div id="child">
    <button v-on:click="tryThis">Enlarge text</button>
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "Child",
  emits: ["enlargeText"],
  methods: {
    tryThis() {
      console.log("trying");
      this.$emit("enlargeText", "someValue");
    },
  },
});
</script>

Родитель:

<template>
  <div>
    <p>Container</p>
    <Child @enlargeText="onEnlargeText" />
  </div>
</template>

<script lang="ts">
import { defineComponent } from "vue";
import Child from "./Child.vue";

export default defineComponent({
  name: "UrlContainer",
  components: {
    Child,
  },
  methods: {
    onEnlargeText() {
      console.log("enlarging text");
    },
  },
});
</script>

Живая демонстрация

person Boussadjra Brahim    schedule 30.10.2020
comment
Я запускал это в демонстрации, и я не вижу вывода «увеличивающийся текст» от функции onEnlargeText. Я думаю, это нужно вывести сюда? - person Keith Darragh; 30.10.2020
comment
Он работает с форматом camelCase, пожалуйста, проверьте это codeandbox.io/s/vue-3-ts-forked-3kg1q?file=/src/components/ - person Boussadjra Brahim; 30.10.2020
comment
Я не голосовал против, не волнуйтесь, вы так помогли! Почему это должен быть верблюжий футляр? В документации говорится, что это должен быть регистр имени события? - person Keith Darragh; 30.10.2020
comment
я знаю, что вы этого не делали, я думаю, что это ошибка, я публикую этот ответ, в котором я рекомендую использовать cabeb-case но когда я попробовал это с vue 3, это не сработало - person Boussadjra Brahim; 30.10.2020
comment
Справедливо! Это работает с корпусом канала, я отмечу его как завершенный :) - person Keith Darragh; 30.10.2020
comment
Я опубликую проблему в репо vue-next - person Boussadjra Brahim; 30.10.2020
comment
это проблема, которую я опубликовал - person Boussadjra Brahim; 30.10.2020