Vueコンポーネント内でJqueryプラグインを使う方法
Laravel + Vue.jsで開発をしています
一応正式な形に則って、動的な更新をVueコンポーネントに委託しています
ところがちょっと困ったのが、Vueコンポーネント内でJqueryプラグインを動かす方法です
Tagsinput.js
今回使いたかったのは、タグインプットプラグインであるbootstrap4-tagsinput
このプラグインについての導入の仕方はこちらをご覧ください
このJqueryプラグインをVueコンポーネント内に適用しようとして不具合が発生しました
構成
今回のファイル構成はこんな感じです
Bladeファイル
@section('content')
<div>
<div id="app">
<my-component></my-component>
</div>
</div>
@endsection
Vueコンポーネント
<template>
<div v-for="(user,index) in users" :key="index">
{{ user.name }}
</div>
</template>
<script>
export default {
data() {
return {
users: []
};
},
mounted() {
axios
.get("/api/getusers/")
.then(response => (this.users = response.data));
},
</script>
APIの内容は省略しますが、簡単に説明すると
Vueコンポーネント内で動的に取得したユーザデータを、template内のv-forで回して表示します
ユーザ数分の名前が動的に生成されるわけですね
不具合
長い前提が終わりやっと不具合の説明となるわけですが、
このユーザの名前欄の下にTagsinputを表示したかったわけですよ
<template>
<div v-for="(user,index) in users" :key="index">
{{ user.name }}
<input id="tags" name="tags" class="tags" type="text" data-role="tagsinput" value="Jquery,PHP">
</div>
</template>
<script>
export default {
data() {
return {
users: []
};
},
mounted() {
axios
.get("/api/getusers/")
.then(response => (this.users = response.data));
},
</script>
こんな感じで
なのでapp.jsにTagsinputのファイルを追加して、いざ準備万端と思いきや、タグとして表示されない
解決法
「Vueコンポーネントのupdated内でTagsinputを初期化する」
です
<template>
<div v-for="(user,index) in users" :key="index">
{{ user.name }}
<input id="tags" name="tags" class="tags" type="text" data-role="tagsinput" value="Jquery,PHP">
</div>
</template>
<script>
export default {
data() {
return {
users: []
};
},
mounted() {
axios
.get("/api/getusers/")
.then(response => (this.users = response.data));
},
updated(){
$('.tags').tagsinput()
}
</script>
そもそもTagsinputはJavaScript側から明示的に初期化する必要はありません
Bladeファイルの読み込み時に一旦Tagsinputの初期化が走るんですが、タイミング的に動的に生成されるVueコンポーネント内のtagはかなり後になるので、ここに適用されないのが原因でした
updatedはデータの更新後に実行されるVueのライフサイクルフックです
動的なデータ取得(axios)がなければmounted内でも大丈夫だと思います
つまり、動的に生成されたデータが構成された後で初期化を明示的に実行するわけですね
ふう、これでちゃんとVueコンポーネント内でもJqueryプラグインが実行できるようになりました
ディスカッション
コメント一覧
まだ、コメントがありません
新たにPostされたDocs
: ツール関連
キーボードを銀軸から赤軸に買い替えた話
約3年半前、仕事で使うキーボードとしてARCHISS ProgresTouchの ...: スマホ
楽天モバイルがおすすめできない人の特徴とは?
楽天モバイルの最強プランをおすすめできない人の特徴を簡単にまとめてみました また ...: システム開発
なぜスクラムがつらいのか?開発現場が疲弊するのか?スクラムに対する違和感と共に原因を考えてみた
今ではどこの開発現場に行っても、やれスクラムスクラムと、まるでスクラムでもやって ...: Laravel
1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLara ...: Laravel
Laravelで複数画像アップロード時のvalidateを指定【Laravel10】
jQuery - Image Uploaderを使って、フォームから複数の画像を ...HashMap
created_by
はやぴ
Web/アプリ開発エンジニア
Sierにてお堅いB向けのソフトウェア開発を経て、現在はC向けのWebやアプリを中心に開発しています。
Utilities