Vue3のcompositionAPIを使っていて、使いなれた jQuery と比較して不便というか、思ったところに手が届かないと感じることがいくつかあります。
その一つは、DOM要素の直接的な扱いが難しいと感じる点です。
jQueryはそもそもDOMを操作する、DOM要素を柔軟に取得するという考えから発展した仕組みですので、当然のように様々な要素をすぐに扱うことができます。
jQueryの場合
例えば <div id=”foo”> にイベントリスナーを設置したければ
$( '#foo' ).on( 'click', (event)=>{
// 処理
} )
のように書けますし、動的に生成されるような要素であれば
$( window ).on( '#foo1', 'click', (event) =>{
// 処理
} )
の様に書けば、動的に生成、削除されるようなDOMの扱いもスムーズです。
同様に windowなどの要素も、上記と同じ書き方で扱えます。
$( window ).on( 'click', (event) =>{
// 処理
} )
こんな感じです。
Vue Composition API の場合
jQuery はそこに存在するDOMの要素選択や操作を便利にすることが主目的なことに対してVue の Composition APIは、ドキュメントを生成することが主目的ですので、DOMの考え方がそもそも違います。ので、IDを指定するなどしてDOMの検索を行うより、タグにトリガーを書くほうが効率的です。
<q-btn v-on:click="foo" />
:
:
const foo = () => {
// 処理
}
そこで困った!Windowイベントのリスナー設置
例えばファイルのドロップをさせたい場合など、Windowにリスナーを設置したい場合があります。
この書き方がいくら調べてもわかりませんでした。
そこで vue3-dropzone などの入れてみたのですが、ちょっと思った動作と違ったためどうしたものかと悩んでいたら…解決方法が単純でした。
App.vue の onMountede に普通に書く
という本当に単純な解決方法が一番早いようです。
<template>
</template>
<script>
import { onMounted } from 'vue'
export default {
setup () {
onMounted(()=>{
window.addEventListener( 'drop',(event)=>{
// event.stopPropagation()
// event.preventDefault()
// console.log()
} )
})
}
</script>
こんな感じです。
ほぼ丸一日書けて調べたり代替手段を探したりしましたが、解決すると単純なものです。
コメント