首页 文章

在vue.js模板中包含外部脚本

提问于
浏览
6

我试图在一个允许的模板中包含一个外部脚本(例如 <script src="..." ) .

我的index.html文件类似于最初生成的文件:

<html lang="en">

<head>
  <title>App</title>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">

</head>

<body>
  <div id="app"></div>

  <!-- jQuery first, then Tether, then Bootstrap JS. -->
  <script src="https://code.jquery.com/jquery-3.1.1.slim.min.js" integrity="sha384-A7FZj7v+d/sdmMqp/nOQwliLvUsJfDHW+k9Omg/a/EheAdgtzNs3hpfag6Ed950n" crossorigin="anonymous"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
</body>

</html>

我的App.vue也类似于生成的:

<template>
<div id="app">

  <div class="container pt-5">
    <router-view></router-view>
  </div>

</div>
</template>

我的路由文件中有一个到 /upload 的路由,它映射到需要dropzone.js(外部脚本)的上传组件 . 我可以将它包含在我的index.html中,类似于如何加载引导程序,但是当只有这个组件需要它时,为每个页面/组件加载它似乎不太理想 .

但是,如上所述,我只是将它包含在我的模板文件中:

<template>
<div>
  <h2>Upload Images</h2>
  <form action="/file-upload" class="dropzone">
    <div class="fallback">
      <input name="file" type="file" multiple />
      <input type="submit" value="upload" />
    </div>
  </form>
</div>

<script src="https://example.com/path/to/dropzone"></script>
</template>

<script>
export default {
  data() {
    return {}
  }
}
</script>

<style>  
</style>

如何仅为一个组件包含外部脚本?

2 回答

  • 1

    您可以定义一个负责脚本加载的方法,并在挂载或创建的挂钩中调用它,如下所示:

    <script>
          export default {
            data() {
              return {}
            },
            methods: {
              loadJs(url, callback) {
                jQuery.ajax({
                  url: url,
                  dataType: 'script',
                  success: callback,
                  async: true
                });
              }
            },
            mounted() {
              this.loadJs('url_to_someScript.js', function() {
                //Stuff to do after someScript has loaded
              });
            }
          }
    </script>
    
  • 2

    脚本标签本质上是全局的 . 在模板中包含脚本标记不是您如何处理模块系统(至少目前如此) .

    您可以使用npm, npm install dropzone --save 将其安装为节点模块 .

    然后在组件代码中导入它 .

    import drozone from 'dropzone';
    export default {
      // Component code...
    }
    

    但是,请注意,除非您使用webpack代码拆分功能,否则捆绑包将在每个页面中包含dropzone . 有关如何使用Vue Router拆分捆绑包的官方教程,请参阅here .

相关问题