Недопустимый обработчик клика по событию: получил неопределенное значение Vue.js

Я новичок в Vue.js и работаю с модальными окнами. В основном я использую фреймворк Buefy. Это мой пример кода:

<template>
    <section>
        <button class="button is-primary is-small" @click="addModal = true">
              <span>Insert New</span>
            </button>

        <b-modal :active.sync="addModal"
                 has-modal-card
                 trap-focus
                 :destroy-on-hide="false"
                 aria-role="dialog"
                 aria-modal>
            <modal-form v-bind="formProps"></modal-form>
        </b-modal>
    </section>
</template>

<script>
const ModalForm = {
  props: ["tagName", "moreFields"],
  template: `
            <form action="">
                <div class="modal-card" style="width: auto">
                    //input fields here
                    <footer class="modal-card-foot">
                        <button class="button" type="button" @click="$parent.close()">Close</button>
                        <button class="button is-primary" @click="addTag">Add Tag</button>
                    </footer>
                </div>
            </form>
        `,
};
export default {
  components: {
    ModalForm,
  },
  data() {
    return {
      data: {
        tagName: "",
      },
      addModal: false,
    };
  },
  methods: {
    addTag() {
      if (this.data.tagName.trim().length > "") {
        console.log(mydata);
      }
    },
  },
};
</script>

Однако, когда я пытаюсь нажать кнопку Add Tag, я получаю сообщение об ошибке Invalid handler for event "click": got undefined... Кажется, с этим так много проблем, и я не хотел дублировать сообщение, но я искал на сайте, и в основном у людей были проблемы с опечатками. (method вместо methods). Будет ли это из-за объема модального окна? Это как-то addTag ему не видно?

Как мне это исправить?


person adamshu653    schedule 02.08.2020    source источник
comment
Добро пожаловать! Я добавил теги vue.js и buefy. Пожалуйста, добавьте все соответствующие теги к будущим вопросам. Спасибо.   -  person iAmOren    schedule 02.08.2020


Ответы (1)


В моем коде разница в том, что все, что вы объявляете в функции data(), похоже на локальную переменную для вашего компонента. Таким образом, чтобы получить к нему доступ, вам не нужно использовать this.data.tagName, вы должны получить прямой доступ.

Вы должны изменить свой код на:

if (this.tagName.trim().length > 0) {
   console.log('mydata');
}

Ваша переменная mydata нигде не объявлена. Итак, я печатаю строку «mydata».

Еще одна вещь, которую нужно изменить в вашем коде, это то, что вы не можете иметь html-код внутри вашего сеанса <script> из вашего .vue файла. Если вы хотите использовать, вы должны объявить новый компонент или поместить код в сеанс <template> вашего файла .vue.

Если вы хотите поместить все в шаблон:

шаблон сеанса из .vue файла:

<template>
<section>
    <button class="button is-primary is-small" @click="addModal = true">
          <span>Insert New</span>
        </button>
        <b-modal :active.sync="addModal"
             has-modal-card
             trap-focus
             :destroy-on-hide="false"
             aria-role="dialog"
             aria-modal>
        <modal-form v-bind="formProps">
          <form action="">
            <div class="modal-card" style="width: auto">
            //input fields here
            <footer class="modal-card-foot">
                <button class="button" type="button" @click="$parent.close()">Close</button>
                <button class="button is-primary" @click="addTag">Add Tag</button>
            </footer>
            </div>
        </form>
      </modal-form>
    </b-modal>
</section>
</template>

Другой вариант — переместить код из формы в новый компонент и импортировать его как компонент в текущий файл .vue.

components/Modalform.vue

<template>
   <form action="">
        <div class="modal-card" style="width: auto">
        //input fields here
        <footer class="modal-card-foot">
        <button class="button" type="button" @click="$parent.close()">Close</button>
        <button class="button is-primary" @click="addTag">Add Tag</button>
        </footer>
        </div>
   </form>
</template>

<script>
export default {
  name: "ModalForm",
};
</script>

page.vue

<template>
  <section>
        <button class="button is-primary is-small" @click="addModal = true">
              <span>Insert New</span>
            </button>

        <b-modal :active.sync="addModal"
                 has-modal-card
                 trap-focus
                 :destroy-on-hide="false"
                 aria-role="dialog"
                 aria-modal>
            <ModalForm v-bind="formProps"></ModalForm>
        </b-modal>
    </section>
</template>

<script>
import ModalForm from "@/components/Modalform.vue";
export default {
  name: "Home",
  components: {
    ModalForm
  }
};
</script>
person Danizavtz    schedule 02.08.2020
comment
На самом деле я показываю уведомление в блоке if. Однако этот метод никогда не достигается. Если это имеет значение, фактическая строка внутри моего оператора if — это this.info("Tag name is ok");, где информация — это компонент уведомления, который я объявил где-то еще. Но да, как я уже сказал, этот метод никогда не достигается в первую очередь - person adamshu653; 02.08.2020
comment
Возможно, это потому, что ваши реквизиты имеют то же имя, что и объект данных. Вы можете изменить? Просто для подтверждения? - person Danizavtz; 02.08.2020
comment
Теперь я получаю Property or method "addTag" is not defined on the instance but referenced during render. поверх этого. Я использую код из здесь под Launch Component Modal, если вы можете воспроизвести - person adamshu653; 02.08.2020
comment
Я не знаю, можете ли вы использовать его таким образом. Весь ваш HTML-код должен быть внутри тега <template>. Вы не можете объявить template в своем сеансе скрипта из файла .vue. Вы должны объявить весь html внутри сеанса ‹template›. - person Danizavtz; 02.08.2020
comment
Ааа отметил. Я все еще новичок в Vue, поэтому я почитаю об этом больше. Я обновлю здесь, если будет прорыв - person adamshu653; 02.08.2020