VueJS’te sürükle bırak yapmak (Hazır paket kullanmadan)

“Amerika’yı yeniden keşfetmenin alemi yok, hazır bir paket varsa kullan konuyu kapat” ezberinin haklılık yanı elbette var ancak kullandığınız paket sayısı arttıkça projenin sağlığı zarar görebiliyor. Bu nedenle gelişen teknolojiyi takip edip, paket kullanmadan yapılabilecek işlemleri kendimiz yapmalıyız.

Safa Gayret
2 min readJun 15, 2022

GitHub Repo: https://github.com/gayret/vue-drag-and-drop

Canlı demo: https://vue-drag-and-drop.netlify.app

HTML ve JavaScript kullanarak dakikalar içerisinde sürükle bırak işlemi yaptırabilirsiniz.

Hadi basit bir Todo geliştirelim

Öncelikle reaktif bir array oluşturalım.

const todos = reactive([
{
id: 1,
title: 'Watch The Matrix',
completed: false,
},
{
id: 2,
title: 'Write an essay about Vue',
completed: false,
},
{
id: 3,
title: 'Learn NextJS',
completed: true,
},
])

Ardından bu array’daki bilgileri computed ile filtreleyip çekelim.

const thingToDo = computed(() => {
return todos.filter((item) => !item.completed)
})
const completed = computed(() => {
return todos.filter((item) => item.completed)
})

Sonrasında Vue Template bölümünde bir v-for döngüsü yaratalım. Böylece yapılacaklar listesini ortaya koyalım.

Listedeki item’lara draggable=’true’ attribute ekleyerek sürüklenebilir olmasını sağlayın.

<ul v-if="thingToDo.length > 0">
<li
v-for="(todo, index) in thingToDo"
:key="todo.id"
draggable="true"
@dragstart="onDrag($event, todo.id)">
<label>
<input type="checkbox" v-model="todo.completed" />
{{ todo.title }}
</label>
</li>
</ul>

Listedeki item’lardan hangisinin sürüklenmeye başladığını bilmemiz gerekiyor. Bunun için @dragstart event’ı gerçekleştiğinde tetiklenmek üzere onDrag methodumuzu yazalım. Bu methoda $event ve todo bilgilerini gönderelim.

const onDrag = (event, id) => {
event.dataTransfer.setData('itemIndex', id)
}

onDrag methodumuz şunu yapar, Event’in dataTransfer alanına, daha sonra itemIndex key’i ile get edilebilecek şekilde set eder. Yani o an sürüklemeye başlanan item’ın Id bilgisini sanal bir state’e yazar.

Artık kullanıcının hangi item’ı sürüklediğini biliyoruz.

Kullanıcının sürüklediği item’ı bırakabileceği bir alan yaratalım

Sürüklenen item’ın bırakılmasını istediğimiz HTML element’e şu iki attribute’ü ekleyin. @dragenter.prevent @dragover.prevent

Ardından aynı HTML element’in @drop event’ı gerçekleştiğinde tetiklenmek üzere onDrop methodumuzu yazalım.

const onDrop = (event) => {
const itemId = event.dataTransfer.getData('itemId')
const item = todos.find((item) => item.id == itemId)
const itemIndex = todos.indexOf(item)
todos[itemIndex].completed = !todos[itemIndex].completed
}

Bu method ile, az önce set ettiğimiz Id bilgisine erişiyoruz, sonra Array’deki index konumunu öğreniyoruz. Güncellemek istediğimiz (completed) bilgisini değiştiriyoruz.

Hepsi bu kadar.

Hiçbir hazır paket kullanmadan sürükle bırakma işlemi yaptık.

Bu örnekte sürüklenen item önceki bulunduğu yerden silinip, sadece yeni konumunda bulunacak. Her iki yerde de bulunmasını istersek, bunu item’in state bilgisini mutate etmeden yapmalıyız. Belki ilerde bununla ilgili bir örnek ekleyerek bu yazıyı güncellerim.

--

--

Safa Gayret
Safa Gayret

No responses yet