VueJs 模板。如何加载外部模板

IT技术 javascript jquery angularjs vue.js
2021-03-21 19:01:14

我是 Vue.js 的新手,我使用 AngularJS 有一段时间了,在 angular 中我们用来加载模板,例如,

template: '/sometemplate.html',
controller: 'someCtrl'

我们如何在 Vue 中做这样的事情,而不是像这样在 JavaScript 中保留大型 HTML 模板,

new Vue({
  el: '#replace',
  template: '<p>replaced</p>'
})

这对于小模板来说是可以的,但是对于大模板来说这实用吗?

有没有办法像 Vue 一样加载外部模板 HTML 或在脚本标签内使用 HTML 模板?

<script type="x-template" id="template">HTML template goes here</html>
6个回答

您可以通过引用脚本标签模板来使用它的id.

{
  template: '#some-id'
}

不过,我强烈建议使用vueify(如果您使用browserify)或 vue-loader(如果您使用 webpack),这样您就可以将您的组件存储在这样的小.vue文件中。

vue 文件

另外,Vue 的作者写了一篇关于外部模板 url 主题的好文章:

https://vuejs.org/2015/10/28/why-no-template-url/

回答了我自己的问题。在此处找到支持的引擎
2021-04-24 19:01:14
“为什么没有模板 url”中提出的观点不是基本上使微前端变得不可能吗?
2021-04-26 19:01:14
那篇博文中唯一有value的论点是关于请求数量的论点。其余的是意见和bs。使用 .vue 有正确的语法高亮?在我不得不使用 .vue 文件之前,我有正确的语法高亮。
2021-04-29 19:01:14
@NicuSurdu 实际上这正是 Angular 如此臃肿和沉重的原因。我同意开发人员更容易,但客户遭受了很多痛苦。
2021-04-30 19:01:14
您能否像lang='sass'<style>元素中设置一样,将模板的语言设置为 Slim 或 Haml 之类的语言如果是这样,是否有其他依赖项可以使转译工作?
2021-05-09 19:01:14

你可以试试这个:
对于 Vue2:https : //github.com/FranckFreiburger/http-vue-loader
对于 Vue3:https : //github.com/FranckFreiburger/vue3-sfc-loader

示例(Vue2):

 new Vue({
        components: {
            'my-component': httpVueLoader('my-component.vue')
        },
        ...

示例(Vue3):

Vue.createApp({
  components: {
    'my-component': Vue.defineAsyncComponent(() => loadModule('./myComponent.vue', opts))
  },
  ...
...是推荐的选择,而不是唯一的选择
2021-04-22 19:01:14
不幸的是,不建议在生产中使用。看起来像使用npm并且webpack是唯一的选择。
2021-04-25 19:01:14
好吧,如果您作为这个插件的创建者,认为我会尝试一下。
2021-05-15 19:01:14

大卫,这是一个很好的例子,但确保 DOM 被编译的最佳方法是什么?

https://jsfiddle.net/q7xcbuxd/35/

当我模拟一个异步操作时,就像上面的例子一样,它可以工作。但是一旦我“即时”加载外部页面,Vue 就会抱怨,因为 DOM 还没有准备好。更具体地说: 有没有比在页面加载时调用更好的方法来做到这一点我已经尝试过,但这没有帮助。Uncaught TypeError: Cannot set property 'vue' of undefined$compile$mount

更新: 没关系,我终于想出了怎么做:

Vue.component('async-component', function (resolve, reject) {
    vue.$http.get('async-component.html', function(data, status, request){
        var parser = new DOMParser();
        var doc = parser.parseFromString(data, "text/html");
        resolve({
            template: doc
        });
    });
});

在实际模板中,我删除了

<script id="someTemplate" type="text/x-template"></script>

标签,只包含 html。

(此解决方案需要来自https://cdnjs.cloudflare.com/ajax/libs/vue-resource/0.1.10/vue-resource.min.js的 http 加载器

我试过http-vue-loader并且它工作正常。这个库很容易使用并且有很好的文档和例子

尽管您不能直接从文件中加载模板,但您仍然可以将 html 保存在单独的单文件组件中。你甚至可以跳过<script>...</script>一部分。

用法(来自加载程序的文档)

my-component.vue

<template>
    <div class="hello">Hello {{who}}</div>
</template>

index.html

<!doctype html>
<html lang="en">
  <head>
    <script src="https://unpkg.com/vue"></script>
    <script src="https://unpkg.com/http-vue-loader"></script>
  </head>

  <body>
    <div id="my-app">
      <my-component></my-component>
    </div>

    <script type="text/javascript">
      new Vue({
        el: '#my-app',
        components: {
          'my-component': httpVueLoader('my-component.vue')
        }
      });
    </script>
  </body>
</html>

两个文件应该放在同一个文件夹中

1. 在 Vue 2.x 中,我建议通过使用 .vue 文件来坚持约定,而是颠倒导入的顺序:

// template.vue
<template>
  <div class="helloworld">
      <h1>Hello world</h1>
  </div>
</template>

<script>
  import src from './src'
  export default src
</script>

并在一个单独的文件中

// src.js
export default {
  name: 'helloworld',
  props: {},
  ...
}

然后在您的组件注册中

import helloworld from './helloworld/template.vue'

new Vue({
 components: {
 'helloworld': helloworld
},
...})

通过这种方式,您可以两全其美,而不必强迫自己在字符串中构建模板。

2.如果你想延迟加载,显然在Vue 2.x中有一种方法可以做到

new Vue({
 components: {
 'helloworld': () => import(/* webpackChunkName: "helloworld" */ './helloworld/template.vue')
},
...})

这将根据浏览器中该页面的请求加载 helloworld.js(它将包含所有该组件的代码)。

当然,以上所有假设您使用具有import功能的ES6

@saidfagan 你可以在这里看到:kangax.github.io/compat-table/es6最新版本的 Chrome、Firefox 和 Safari 支持超过 90% 的 ES6 功能,最新版本的 Microsoft Edge 也相当不错。如果担心的话,IE11 将是“相关浏览器”支持的落后者。无论哪种方式,如果你想确保你总是可以使用像 Babel 这样的转译器来构建与 vanilla 兼容的 Javascript
2021-05-02 19:01:14
浏览器是否默认启用 ES6?如果没有,我应该如何启用它?
2021-05-04 19:01:14
Vue 文档中描述了可以实现延迟加载的“异步组件”的部分:vuejs.org/v2/guide/...
2021-05-12 19:01:14
这正是我要做的,谢谢你的回答。
2021-05-13 19:01:14