Özel Yönergeler
Özel Yönergeler
const vHighlight = { mounted: el => { el.classList.add('is-highlight') } }
.vt-doc p.is-highlight { margin-bottom: 0; }
.is-highlight { background-color: yellow; color: black; }
Giriş
Vue, core içerisinde gönderilen varsayılan yönerge setinin (örneğin v-model
veya v-show
) yanı sıra, kendi özel yönergelerinizi kaydetmenize de olanak tanır.
Vue'de iki form kod yeniden kullanımını tanıttık: bileşenler
ve composables
. Bileşenler ana yapı taşlarıdır, oysa composables durum mantığını yeniden kullanmaya odaklanır. Özel yönergeler ise esas olarak düz öğelerde düşük seviyeli DOM erişimini içeren mantığı yeniden kullanmak için tasarlanmıştır.
Bir özel yönerge, bir bileşenin yaşam döngüsü kancalarına benzer bir nesne olarak tanımlanır. Kancalar, yönergenin bağlandığı elementi alır. İşte Vue tarafından DOM'a eklendiğinde bir elemana sınıf ekleyen bir yönerge örneği:
<script setup>
// şablonlarda v-highlight'ı etkinleştirir
const vHighlight = {
mounted: (el) => {
el.classList.add('is-highlight')
}
}
</script>
<template>
<p v-highlight>Bu cümle önemlidir!</p>
</template>
const highlight = {
mounted: (el) => el.classList.add('is-highlight')
}
export default {
directives: {
// şablonda v-highlight'ı etkinleştirir
highlight
}
}
<p v-highlight>Bu cümle önemlidir!</p>
Bu cümle önemlidir!
`içinde,
vöneki ile başlayan tüm camelCase değişkenleri özel yönerge olarak kullanılabilir. Yukarıdaki örnekte,
vHighlightşablonda
v-highlight` olarak kullanılabilir.
`kullanmıyorsanız, özel yönergeler
directives` seçeneği kullanılarak kaydedilebilir:
export default {
setup() {
/*...*/
},
directives: {
// şablonda v-highlight'ı etkinleştirir
highlight: {
/* ... */
}
}
}
Bileşenlerde olduğu gibi, özel yönergelerin şablonlarda kullanılabilmesi için kaydedilmesi gerekir. Yukarıdaki örnekte, directives
seçeneği aracılığıyla yerel kayıt kullanıyoruz.
Ayrıca özel yönergelerin global olarak uygulama düzeyinde kaydedilmesi de yaygındır:
const app = createApp({})
// tüm bileşenlerde v-highlight'ı kullanılabilir hale getirir
app.directive('highlight', {
/* ... */
})
Özel Yönergeleri Ne Zaman Kullanmalı
Özel yönergeler yalnızca istenen işlevselliğin doğrudan DOM manipülasyonu ile sağlanabildiği durumlarda kullanılmalıdır.
Bunun yaygın bir örneği, bir öğeyi odaklayan v-focus
özel yönergesidir.
<script setup>
// şablonlarda v-focus'ı etkinleştirir
const vFocus = {
mounted: (el) => el.focus()
}
</script>
<template>
<input v-focus />
</template>
const focus = {
mounted: (el) => el.focus()
}
export default {
directives: {
// şablonda v-focus'ı etkinleştirir
focus
}
}
<input v-focus />
Bu yönerge, yalnızca sayfa yüklendiğinde değil, aynı zamanda öğe dinamik olarak Vue tarafından eklendiğinde de çalıştığı için autofocus
özniteliğinden daha kullanışlıdır!
Mümkünse, daha verimli ve sunucu-rendering dostu olduğu için v-bind
gibi yerleşik yönergelerle bildirimsel şablonlama önerilir.
Yönerge Kancaları
Bir yönerge tanım nesnesi birkaç kanca fonksiyonu sağlayabilir (tümü isteğe bağlı):
const myDirective = {
// bağlanan elementin niteleri
// veya olay dinleyicileri uygulanmadan önce çağrılır
created(el, binding, vnode) {
// argümanlar hakkında daha fazla detay için aşağıya bakın
},
// elementin DOM'a eklenecek olduğu zaman hemen önce çağrılır.
beforeMount(el, binding, vnode) {},
// bağlanan elementin üst bileşeninin
// ve tüm çocuklarının monte edildiğinde çağrılır.
mounted(el, binding, vnode) {},
// üst bileşen güncellenmeden önce çağrılır
beforeUpdate(el, binding, vnode, prevVnode) {},
// üst bileşen ve
// tüm çocukları güncellendikten sonra çağrılır
updated(el, binding, vnode, prevVnode) {},
// üst bileşen montajdan önce çağrılır
beforeUnmount(el, binding, vnode) {},
// üst bileşen montajdan ayrıldığında çağrılır
unmounted(el, binding, vnode) {}
}
Kanca Argümanları
Yönerge kancalarına bu argümanlar geçirilir:
el
: yönergenin bağlandığı element. Bu, DOM'u doğrudan manipüle etmek için kullanılabilir.binding
: aşağıdaki özellikleri içeren bir nesne.value
: Yönergeye geçirilen değer. Örneğinv-my-directive="1 + 1"
içinde, değer2
olacaktır.oldValue
: Önceki değer, yalnızcabeforeUpdate
veupdated
içinde mevcuttur. Değerin değişip değişmediğine bakılmaksızın mevcuttur.arg
: Yönergeye geçirilen argüman, varsa. Örneğinv-my-directive:foo
içinde, arg"foo"
olacaktır.modifiers
: Varsa, işaretçileri içeren bir nesne. Örneğinv-my-directive.foo.bar
içinde, işaretçiler nesnesi{ foo: true, bar: true }
olacaktır.instance
: Yönergenin kullanıldığı bileşenin örneği.dir
: yönerge tanım nesnesi.
vnode
: bağlanan elementi temsil eden alttaki VNode.prevVnode
: önceki render'dan bağlanan elementi temsil eden VNode. SadecebeforeUpdate
veupdated
kancalarında mevcuttur.
Bir örnek vermek gerekirse, aşağıdaki yönerge kullanımını düşünün:
<div v-example:foo.bar="baz">
binding
argümanı şu şekilde bir nesne olacaktır:
{
arg: 'foo',
modifiers: { bar: true },
value: /* `baz` değer */,
oldValue: /* önceki güncellemeden `baz` değeri */
}
Yerleşik yönergelerde olduğu gibi, özel yönerge argümanları dinamik olabilir. Örneğin:
<div v-example:[arg]="value"></div>
Burada yönerge argümanı, bileşen durumundaki arg
özelliğine dayanarak reaktif olarak güncellenir.
el
dışında, bu argümanları yalnızca okunabilir olarak işlemeniz ve asla değiştirmeniz önerilmez. Kancalar arasında bilgi paylaşmanız gerektiğinde, bunu elementin dataset üzerinden yapmanız önerilir.
Fonksiyon Kısayolu
Özel bir yönergenin mounted
ve updated
için aynı davranışa sahip olması yaygındır; diğer kancalara gerek yoktur. Bu gibi durumlarda, yönergeyi bir fonksiyon olarak tanımlayabiliriz:
<div v-color="color"></div>
app.directive('color', (el, binding) => {
// bu hem `mounted` hem de `updated` için çağrılacak
el.style.color = binding.value
})
Nesne Literalleri
Yönergenizin birden fazla değere ihtiyacı varsa, JavaScript nesne literali de geçebilirsiniz. Unutmayın, yönergeler geçerli herhangi bir JavaScript ifadesini alabilir.
<div v-demo="{ color: 'white', text: 'hello!' }"></div>
app.directive('demo', (el, binding) => {
console.log(binding.value.color) // => "white"
console.log(binding.value.text) // => "hello!"
})
Bileşenlerde Kullanım
Bileşenlerde özel yönergelerin kullanılması önerilmez. Bir bileşen birden fazla kök düğme sahip olduğunda beklenmedik davranışlar meydana gelebilir.
Bileşenlerde kullanıldığında, özel yönergeler her zaman bir bileşenin kök düğümüne uygulanır; Fallthrough Attributes
ile benzer şekilde.
<MyComponent v-demo="test" />
<!-- MyComponent şablonu -->
<div> <!-- v-demo yönergesi burada uygulanacak -->
<span>Bileşen içeriğim</span>
</div>
Bileşenlerin birden fazla kök düğüme sahip olabileceğini unutmayın. Çoklu kök bileşenlere uygulandığında, bir yönerge göz ardı edilecek ve bir uyarı verilecektir. Niteliklerin aksine, yönergeler v-bind="$attrs"
ile farklı bir öğeye geçirilemez.