Direktif Kustom

Pendahuluan

Selain kumpulan direktif standard (v-model dan v-show), Vue juga memperbolehkan Anda untuk mendaftarkan direktif kustom milik Anda. Perhatikan bahwa dalam Vue 2.0, bentuk utama dari penggunaan kembali dan abstraksi kode adalah komponen - namun mungkin ada kasus dimana Anda memerlukan akses DOM tingkat rendah pada elemen polos, dan di sini dimana direktif kustom akan tetap bermanfaat. Contoh fokus kepada elemen input, seperti satu ini:

Saat halaman dimuat, elemen tersebut akan mendapatkan fokus (perhatikan: autofocus tidak bekerja pada Safari seluler). Faktanya, jika Anda belum mengklik hal lain sejak mengunjungi halaman ini, input di atas seharusnya sudah fokus sekarang. Sekarang mari kita bangung direktif yang mencapai hal ini:

// Mendaftarkan sebuah direktif kustom dengan nama `v-focus`
Vue.directive('focus', {
  // Saat elemen yang terikat dimasukan ke dalam DOM...
  inserted: function (el) {
    // Fokus terhadap elemen
    el.focus()
  }
})

Jika Anda ingin mendaftarkan direktif secara lokal, komponen juga menerima opsi directives:

directives: {
  focus: {
    // definisi direktif
    inserted: function (el) {
      el.focus()
    }
  }
}

Kemudian di templat, Anda dapat menggunakan atribut v-focus baru pada elemen apa pun, seperti ini:

<input v-focus>

Fungsi Kait

Objek definisi direktif dapat menyediakan beberapa fungsi kait (semua opsional):

Kami akan membahas VNodes secara lebih rinci nanti, ketika kita membahas fungsi render.

Kita akan menjelajahi argumen yang dioper ke kait ini (mis. el,binding, vnode, danoldVnode) di bagian berikutnya.

Argumen Kait Direktif

Kait direktif dioper argumen ini:

Terlepas dari el, Anda harus memperlakukan argumen ini sebagai hanya-baca dan tidak pernah memodifikasinya. Jika Anda perlu berbagi informasi lintas kait, direkomendasikan untuk melakukannya memlalui elemen dataset.

Contoh direktif kustom menggunakan beberapa properti ini:

<div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
Vue.directive('demo', {
  bind: function (el, binding, vnode) {
    var s = JSON.stringify
    el.innerHTML =
      'name: '       + s(binding.name) + '<br>' +
      'value: '      + s(binding.value) + '<br>' +
      'expression: ' + s(binding.expression) + '<br>' +
      'argument: '   + s(binding.arg) + '<br>' +
      'modifiers: '  + s(binding.modifiers) + '<br>' +
      'vnode keys: ' + Object.keys(vnode).join(', ')
  }
})

new Vue({
  el: '#hook-arguments-example',
  data: {
    message: 'hello!'
  }
})

Fungsi Singkatan

Dalam banyak kasus, Anda mungkin menginginkan perilaku yang sama pada bind danupdate, tetapi tidak peduli dengan kait lainnya. Sebagai contoh:

Vue.directive('color-swatch', function (el, binding) {
  el.style.backgroundColor = binding.value
})

Objek Literal

Jika direktif yang Anda perlukan memerlukan beberapa nilai, Anda dapat mengirimkan objek JavaScript literal. Ingat, direktif dapat mengambil ekspresi JavaScript yang valid.

<div v-demo="{ color: 'white', text: 'hello!' }"></div>
Vue.directive('demo', function (el, binding) {
  console.log(binding.value.color) // => "white"
  console.log(binding.value.text)  // => "hello!"
})