#javascript #vue.js
#javascript #vue.js
Вопрос:
У меня есть родительский компонент, который динамически загружает внешний js-файл (как описано здесь).
и дочерний компонент принимает переменную внутри js-файла. но каждый раз, когда я загружаю страницу, дочерний компонент выдает ошибку, потому что дочерний компонент визуализировался до загрузки внешнего js-файла. Как я могу избежать этого?
//in parent component
app = new Vue({
el: '#app',
created() {
this.loadJsFile('assets/js/extra.js')
},
methods: {
loadJsFile(src) {
var script = document.createElement('script');
script.src = src;
let head = document.getElementsByTagName('head')[0];
head.appendChild(script);
},
в extra.js:
var extra = { users:[{id:1, name:'foo'}], images:[...] }
дочерний компонент:
data() {
return {
users:[],
}
},
created(){
this.users = extra.users
},
причина ошибки:
[Vue warn]: Error in created hook: "ReferenceError: extra is not defined"
Ответ №1:
В вашем случае есть несколько вариантов:
1. Вставьте <script>
тег программно
родительский компонент:
<ChildComponent :extra="users"></ChildComponent>
...
mounted() {
this.loadJsFile('assets/js/extra.js').then(() => {
if (window.extra) {
this.users = extra.users
}
})
}
// ...
loadJsFile(src) {
return new Promise((resolve, reject) => {
let script = document.createElement('script');
script.onload = () => {
resolve();
};
script.onerror = () => {
reject();
};
script.src = src;
let head = document.getElementsByTagName('head')[0];
head.appendChild(script);
});
}
дочерний компонент:
...
props: {
extra: Array
},
data() {
return {
users:[],
}
},
created(){
this.users = this.extra.users
},
2. Добавьте <script>
тег в index.html
файл:
Просто добавьте <script src="static/js/extra.js"></script>
в конец index.html
файла, и тогда вы сможете получить доступ к extra
переменной глобально.
Комментарии:
1. Проблема в том, когда указывать дочернему компоненту использовать переменную extra. дочерний компонент выполняет рендеринг перед загрузкой внешнего js-файла
2.
users
Находится в дочернем компоненте, к которому вы не можете получить доступ: this.users3. хорошо, это моя ошибка. Я обновлю следующий ответ, но вы можете перейти
extra
к дочернему компоненту черезprops
или уведомить дочерние компоненты через вызовemit
.4. преимущество управления состоянием в том, что вы можете использовать его везде, я использую внешний js-файл как источник истины,
5. пожалуйста, взгляните на: vuejs.org/v2/guide /…