Vueで動的にコンポーネントを追加する
ちょっとしたダイアログを出したいとか、ポップアップみたいなの出したいとか・・・。
そういうことありませんか?
コンポーネントライブラリ使ってれば、大体網羅できますが、要件に合わないとか、思ってるのとは違うなーみたいな状況とか。
方法
Vue.component
でコンポーネント作って、その場で$mount
までしてあげます。
マウントしたやつをappendChild
なりで入れたいとこに追加。
import PopupComponent from '@/components/popup' export default { handleClick(e) { const Popup = Vue.component('popup', PopupComponent) const popup = new Popup().$mount() document.body.appendChild(popup.$el) } }
props渡したいときは、new Popup({ propData: { } })
で渡せます。
破棄もしっかりと
上で追加はできますが、閉じたときとかに消す必要がありますね。
例えば、画面上のどこかしらクリックされたら消す場合、上でいうとPopup側をこんな感じにしてやるといけます。
export default { created() { document.addEventListener('click', this.handleClickRemove) }, beforeDestroy() { document.removeEventListener('click', this.handleClickRemove) }, methods: { handleClickRemove() { this.$destroy() this.$el.parentNode.removeChild(this.$el) } } }
created
でイベントつけてあげて、beforeDestroy
で消してあげましょう。
あとはthis.$destroy()
で自らをdestroyして、追加されたものもremoveChild
で消してしまうと良いです。