Как запустить код VueJS только после полной загрузки и инициализации Vue?
Я работаю над компонентом Vue, который будет размещен на нескольких веб-сайтах через систему CMS. Проблема, с которой я сталкиваюсь, заключается в том, что даже если мой порядок загрузки JS-скриптов правильный, иногда я получаю эту ошибку:
Uncaught ReferenceError: Vue is not defined
at HTMLDocument.<anonymous>
Vue загружается через cdn, и это выше кода компонента.
весь код Vue запускается следующим образом:
document.addEventListener("DOMContentLoaded", () => {
// here is the Vue code
});
Я даже добавил setTimeout () внутри события DOMContentLoaded и все еще не сделал трюк.
window.onload = function()
не работает во всех случаях. Время от времени я все еще получаю эту ошибку.
Скрипты загружаются в тело.
вы знаете, что это может быть другой подход? Я хочу быть уверен, что в момент запуска кода Vue Vue загружен и готов к инициализации на странице. Спасибо!
2 ответов
использовать нагрузка событие ждать, пока все ресурсы не закончат загрузку:
<script>
window.addEventListener("load", function(event) {
// here is the Vue code
});
</script>
DOMContentLoaded
- это событие, запускаемое при анализе HTML и визуализируется и строится DOM. Обычно он срабатывает довольно быстро в срок службы приложения. С другой стороны,--2--> только уволили, когда все ресурсы (картинки, стили и т. д.) извлекаются из сеть и доступный к браузер.
вы также можете использовать событие load для конкретного скрипта.
использовать vue mounted()
для запуска любого кода при загрузке страницы и updated()
для запуска после любых операций компонентов, поэтому идеальным решением будет объединение обоих Рой Дж и vue жизненный цикл крючки
mounted() {
window.addEventListener('load', () => {
// run after everything is in-place
})
},
// 99% using "mounted()" with the code above is enough,
// but incase its not, you can also hook into "updated()"
//
// keep in mind that any code in here will re-run on each time the DOM change
updated() {
// run something after dom has changed by vue
}
обратите внимание, что можно опустить window.addEventListener()
и он все равно будет работать, но он может пропустить +, если вы используете что-то вроде jquery outerHeight(true)
лучше использовать его внутри события window, чтобы убедиться, что вы получаете правильные значения.
обновление 1 :
вместо window.addEventListener('load')
существует и другой способ с помощью document.readyState
таким образом, выше может быть
mounted() {
document.onreadystatechange = () => {
if (document.readyState == "complete") {
// run code here
}
}
},
обновление 2 :
самый надежный способ, который я нашел до сих пор, будет использовать debounce
on $nextTick
, так что использование становится
import debounce from 'lodash/debounce'
// bad
updated() {
this.$nextTick(debounce(() => {
console.log('test') // runs multiple times
}, 250)) // increase to ur needs
}
// good
updated: debounce(function () {
this.$nextTick(() => {
console.log('test') // runs only once
})
}, 250) // increase to ur needs
при использовании debounce С обновлено это становится сложно, поэтому убедитесь, что проверить его B4 движется дальше.
обновление 3 :
вы также можете попробовать mutationobserver'а
Ps:
если вам нужен способ сделать что-то после того, как список закончил рендеринг, попробуйте пакет, который я сделал специально для этого https://github.com/ctf0/vue-list-rendered