javascript - 导入外部javascript文件并在vue应用程序中全局使用函数

标签 javascript vue.js import

我正在使用 Vue.js (cli 3) 构建一个模拟 webbshop 来练习。我得到了一个 javascript 文件,其中包含按钮、购物篮和结帐的所有功能。

而不是将所有代码复制到我自己的 vue 应用程序中。 如何导入 Javascript 文件而不出现错误?

我尝试过的:

将导入添加到我的 Vue 应用程序中的 main.js 文件中。(我通读了此说明,但老实说我并不完全理解发生了什么)

import webbshop from '@/assets/lib/js/webbshop.js';
Object.defineProperty(Vue.prototype, '$webbshop', { value: webbshop });

在这里找到: https://vuejsdevelopers.com/2017/04/22/vue-js-libraries-plugins/

在开头放置一个 console.log("Test from my webbshop.js")<- 有效

我在 Chrome 中收到此错误:

Uncaught TypeError: Cannot set property 'innerHTML' of null
    at showBasket (webshop.js?709d:146)

保存文档时,我在 VS Code 终端中也收到 21 个错误。 例如。

error: 'i' is already defined (no-redeclare) at src/assets/lib/js/webbshop.js:105:18:
  103 | 
  104 |         // Loopa genom varor
> 105 |         for (var i = 0; i < basketItems.length; i++) {
      |                  ^
  106 |             // Räkna ut kostnad och lägg till summa
  107 |             var itemCost = parseInt(basketItems[i].artCost);
  108 | 

error: 'addToBasket' is defined but never used (no-unused-vars) at src/assets/lib/js/webbshop.js:31:10:
  29 | 
  30 | /* Lägg till i varukorg */
> 31 | function addToBasket(el, id, name, cost, image, notify = false) {
     |          ^
  32 | 
  33 |     // Börja med en vara
  34 |     numOfItems = 1;

当我使用 onclick="addToBasket([someparameters])" 创建按钮时,它会抛出错误:

Uncaught ReferenceError: addToBasket is not defined
    at HTMLButtonElement.onclick ((index):16)

我也尝试过:

在 main.js 的最后,只是为了继续工作,在得到答案之前不会陷入困境。

function loadjsfile(filename){
        var fileref=document.createElement('script')
        fileref.setAttribute("type","text/javascript")
        fileref.setAttribute("src", filename)
}
 
loadjsfile("@/assets/lib/js/webbshop.js")

它根本不加载文件。但没有错误。

来自 main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import webbshop from '@/assets/lib/js/webbshop.js';
Object.defineProperty(Vue.prototype, '$webbshop', { value: webbshop });

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

它不必具有可扩展性或以其他方式成为最佳解决方案。我只想要一种简单的方法,如何从其他文件导入函数,并让它们在我的 Vue 项目的每个组件中都可以全局访问。

我读到here 我无法想象我必须将 module.exports 放在外部文件中的每个函数中。还是我呢?

You need to export the testFunction before you can require it.

module.exports = function testFunction() {
  // function code
}

期望:

我想访问外部 js 文件中的所有函数,以便在我的应用程序中的其他 component.vue 文件中使用。

实际结果:

浏览器读取外部js文件但功能不起作用。

最佳答案

要向 vue 全局添加函数,您需要扩展 vue 并编写为 plugin
这很容易

link

按照如下方式进行:
创建文件plugin.js

import webbshop from '@/assets/lib/js/webbshop.js';

// MyPlugin its just a name change to whatever meet you needs.
MyPlugin.install = function (Vue, options) {
  Vue.myGlobalMethod = function () {
    webshop.dothis();
  };

  Vue.mySecondGlobalMethod = function (a,b,c) {
    webshop.dothis(a,b,c);
  };
...
}

现在将其导入到主 Vue 文件中。

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import plugin from './plugin'

Vue.config.productionTip = false

Vue.use(plugin)

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

之后,vue 将您的自定义方法附加到所有 vue 实例。
您只需将其引用到 vue 内部函数即可在任何地方访问它。
在标记中:

<h1 v-text="mySecondGlobalMethod(1,2,3)"></h1>

在 JavaScript 中:

 const b = this.myGlobalMethod();

关于javascript - 导入外部javascript文件并在vue应用程序中全局使用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54624596/

相关文章:

javascript - yarn 与 Npm - "works on my machine"- 澄清?

javascript - Google map 动态语言更改

javascript - 动态选项的计算 getter 和 setter

javascript - 在Reactjs中根据条件导入组件(Conditional based import)

php - 将 CSV 导入 Mysql 期间的 NULL 字段

Python 从模块变量导入

javascript - 模态接收错误数据

javascript - js 设备和方向检测

javascript - 从链接 href 和 Vuetify v-btn 下载 Vue 文件

vue.js - 仅在有内容时显示插槽