Расширить директиву vueJs v-on: нажмите

Я новичок в vuejs. Я пытаюсь создать свое первое приложение. Я хотел бы показать подтверждающее сообщение при каждом нажатии на кнопки.

Пример:

<button class="btn btn-danger" v-on:click="reject(proposal)">reject</button>

Мой вопрос: могу ли я продлить v-on:click событие, чтобы показать подтверждение везде? Я бы сделал свою специальную директиву под названием v-confirm-click сначала выполняется подтверждение, а затем, если я нажимаю "ОК", выполняется событие щелчка. Является ли это возможным?

2 ответа

Решение

Я бы порекомендовал компонент вместо. Директивы в Vue обычно используются для прямого манипулирования DOM. В большинстве случаев, когда вы считаете, что вам нужна директива, компонент лучше.

Вот пример компонента кнопки подтверждения.

Vue.component("confirm-button",{
  props:["onConfirm", "confirmText"],
  template:`<button @click="onClick"><slot></slot></button>`,
  methods:{
    onClick(){
      if (confirm(this.confirmText))
        this.onConfirm()
    }
  }

})

Который вы могли бы использовать так:

<confirm-button :on-confirm="confirm" confirm-text="Are you sure?">
  Confirm
</confirm-button>

Вот пример.

console.clear()

Vue.component("confirm-button", {
  props: ["onConfirm", "confirmText"],
  template: `<button @click="onClick"><slot></slot></button>`,
  methods: {
    onClick() {
      if (confirm(this.confirmText))
        this.onConfirm()
    }
  }

})

new Vue({
  el: "#app",
  methods: {
    confirm() {
      alert("Confirmed!")
    }
  }
})
<script src="https://unpkg.com/vue@2.2.6/dist/vue.js"></script>
<div id="app">
  <confirm-button :on-confirm="confirm" confirm-text="Are you sure?">
    Confirm
  </confirm-button>
</div>

Я не знаю, как продлить директиву. Достаточно просто включить confirm вызовите обработчик кликов. Он не будет конвертировать каждый клик в подтвержденный клик, но не будет писать новую директиву; в любом случае вы должны обновить весь свой код, чтобы использовать новую форму.

new Vue({
  el: '#app',
  methods: {
    reject(p) {
      alert("Rejected " + p);
    }
  }
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.3.4/vue.min.js"></script>
<div id="app">
  <button class="btn btn-danger" @click="confirm('some message') && reject('some arg')">reject</button>
</div>

Другие вопросы по тегам