Vous pouvez charger le script dont vous avez besoin avec une solution basée sur une promesse:
export default {
data () {
return { is_script_loading: false }
},
created () {
// Si un autre composant charge déjà le script
this.$root.$on('loading_script', e => { this.is_script_loading = true })
},
methods: {
load_script () {
let self = this
return new Promise((resolve, reject) => {
// si le script est déjà en cours de chargement via un autre composant
if ( self.is_script_loading ){
// Résoudre lorsque l'autre composant a chargé le script
this.$root.$on('script_loaded', resolve)
return
}
let script = document.createElement('script')
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js')
script.async = true
this.$root.$emit('loading_script')
script.onload = () => {
/* émettre sur le bus d'événements global pour informer les autres composants
* que nous chargeons déjà le script */
this.$root.$emit('script_loaded')
resolve()
}
document.head.appendChild(script)
})
},
async use_script () {
try {
await this.load_script()
// .. faites ce que vous voulez après le chargement du script
} catch (err) { console.log(err) }
}
}
}
Veuillez noter que this.$root
est un peu bricolé et vous devriez utiliser une solution vuex ou un eventHub pour les événements globaux à la place.
Vous feriez du code ci-dessus un composant et l'utiliseriez où c'est nécessaire, il ne chargera le script que lorsqu'il est utilisé.
REMARQUE: Ceci est une solution basée sur Vue 2.x. Vue 3 a cessé de prendre en charge $on
.