Компоненты в песочнице загружаются асинхронно - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь загрузить отдельные автономные файлы HTML в мое приложение Vue.js в виде изолированных приложений в виде песочницы, которые затем я хочу преобразовать в изолированные компоненты, где ни один из кодов в загруженном файле не будет мешатькод приложения Vue и наоборот - что-то вроде стилей области действия Vue, но не только для стилизации, но также для разметки и функциональности.

Идея этих автономных HTML-файлов заключается в том, что кто-то должен иметь возможность написать одинФайл .html, содержащий все стили (в <head>) и функциональные возможности (в <script>) и загружающий его на сервер, с которого мое приложение Vue затем извлечет эти файлы и отобразит их как компоненты настраница, , но важная часть заключается в том, что у вас должна быть возможность писать файлы компонентов HTML так, как вы хотите. Например, я должен иметь возможность писать HTML / CSS / Vanilla.js или HTML / CSS /Jquery и т. Д. В основном это должно работать как iframes, но как компоненты Vue.js, если это имеет смысл?

Вот что яМы попробовали:

Автономный одностраничный HTML-файл

<!-- 
To get this code, my Vue app does an asynchronous GET call to localhost:3000/test,
which returns this file as a string. but in practice, it won't really matter where 
the file comes from.
        -->
<html>
    <head>
        <title></title>
        <script src="url-to-jquery-cdn" crossorigin="anonymous"></script>
    </head>
    <body>
        <p>External Component 1. Wooo!</p>

        <button onclick="serverCall()">Server Call!</button>

        <script>
            function serverCall() {
                console.log('Bam!');

                $.ajax({
                    type: 'POST',
                    url: 'http://localhost:3000/test',
                    success: data => {
                        console.log('success!', data);
                    }
                });
            }
        </script>
    </body>
</html>

main.js
Эта часть, кажется, работает нормально (т. е. не выдается никаких ошибок).

// ...
Vue.component('external-component', function(resolve, reject) {
    Vue.http.get('http://localhost:3000/test').then(data => {
        const doc = new DOMParser().parseFromString(data.body, 'text/html');
        resolve({
          template: doc
        });
    }).catch(err => {
        console.log('err:', err);
    });
});
// ...

App.vue
Но здесь возникает проблема

<template>
  <div class="home">
    <external-component></external-component>
  </div>
</template>

<script>
  export default {}
</script>

Как только я добавляю тег компонента в файл .vue, он выдает следующие две ошибки:

[Vue warn]: Error in nextTick: "TypeError: vm.$options.template.charAt is not a function"

TypeError: vm.$options.template.charAt is not a function
  at mountComponent (vue.runtime.esm.js?2b0e:4021)
  at VueComponent.Vue.$mount (vue.runtime.esm.js?2b0e:8409)
  at init (vue.runtime.esm.js?2b0e:3118)
  at createComponent (vue.runtime.esm.js?2b0e:5972)
  at createElm (vue.runtime.esm.js?2b0e:5919)
  at updateChildren (vue.runtime.esm.js?2b0e:6210)
  at patchVnode (vue.runtime.esm.js?2b0e:6313)
  at VueComponent.patch [as __patch__] (vue.runtime.esm.js?2b0e:6476)
  at VueComponent.Vue._update (vue.runtime.esm.js?2b0e:3942)
  at VueComponent.updateComponent (vue.runtime.esm.js?2b0e:4060)

Если кто-нибудь может посоветовать мне, как я мог бы реализовать этот тип функциональности, я был бы очень признателен.Я также открыт для предложений, которые полностью меняют парадигму или даже не включают Vue.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...