【问题标题】:VueJS accessing externaly imported method in vue componentVueJS访问vue组件中的外部导入方法
【发布时间】:2018-08-15 03:26:06
【问题描述】:

我有一个外部 Java 脚本文件 something.js

function myFun(){
  document.getElementById("demo").innerHTML="Hello World!";
  }

export default myFun;

这是我的 vue 组件 Dashboard.vue

<template>
    <div>
        <button type="button" name="button" @click="">Call External JS</button>
        <div id="demo"></div>
    </div>
</template>

<script>
import something from "./something.js"
export default {

created(){
}
}
</script>

我有两个问题。

  1. 首先如何在创建的生命周期钩子中调用这个方法来自动运行。
  2. 其次如何通过点击“调用外部JS”按钮来调用此方法

因为我知道更改 div 的内容可以通过 vueJS 轻松完成,而无需纯 JS 外部文件的帮助。但是我问这个问题是为了澄清如何在 vue 组件中使用外部 JS 文件的概念。

谢谢。

【问题讨论】:

标签: javascript vue.js vuejs2 export vue-component


【解决方案1】:

更好的解决方案是使用 mixins:

import something from './something.js'
export default {
  mixins: [something]
}

现在您可以直接在this 上使用您在something.js 中导出的任何方法/计算。

因此,在您的示例中,您从 something.js 导出了 myFun(),我们可以像这样从 Dashboard.vue 调用它:

<template>
    <div>
        <button type="button" name="button" @click="myFun">Call External JS</button>
        <div id="demo"></div>
    </div>
</template>

<script>
    import something from "./something.js"
    export default {
        mixins: [something],
        mounted(){
            this.myFun()
        }
    }
</script>

我希望我的语法是正确的,但这通常是 mixins 的想法。

【讨论】:

    【解决方案2】:
    1. 您可以在任何您想要的生命周期方法下调用导入的something 函数。在这里,我建议使用mounted 方法。组件的所有 HTML 都呈现后触发。

    2. 可以在vue组件的methods下添加something函数,然后直接从模板调用函数。

    <template>
        <div>
            <button type="button" name="button" @click="something">
                Call External JS
            </button>
            <div id="demo"></div>
        </div>
    </template>
    
    <script>
    import something from "./something.js"
    
    export default {
        mounted() {
            something()
        },
        methods: {
            something,
        },
    }
    </script>
    

    【讨论】:

      【解决方案3】:

      另一种方法是在数据块中添加方法:

      import something from "./something.js" // assuming something is a function
      
      data() {
        return {
          // some data...
          something,
        }
      }
      

      然后在你的模板中使用它:

      <template>
          <div class="btn btn-primary" @click="something">Do something</div>
      </template>
      

      【讨论】:

      • 如果您需要更新正在注入的对象的状态,此解决方案很有用
      • 不错的解决方案!更干净、更通用!
      【解决方案4】:

      以您的示例为例,外部 javascript 文件 something.js

      function myFun(){
         document.getElementById("demo").innerHTML="Hello World!";
      }
      
      export default myFun;
      

      您可以在方法中像对象一样解析它:{} 在 Dashboard.vue

      <template>
          <div>
              <button type="button" name="button" @click="something">Call External JS</button>
              <div id="demo"></div>
          </div>
      </template>
      
      <script>
      import something from "./something.js"
      export default {
      
         methods: {
            something,
         }
      }
      </script>
      

      【讨论】:

      • 如果两个分开的文件包含在方法中怎么办?像something1.js 和something2.js 以下不起作用:
      • @user2543127 它应该可以工作,如果你的 something1.js 和 something2.js 分别导出一个方法/函数 PS:你需要确保变量 something1、something2 持有一个函数。跨度>
      • 我试过了,但没用。你能给我一个例子吗?谢谢
      • @user2543127 请为示例找到以下存储库。 github.com/LarryMckuydee/vue-export-example
      【解决方案5】:

      反应式或与组件(不是API)耦合的方法应该写在methods中。我遵循这种做法。 我在这里有一个场景来澄清你的概念:

      JS 文件(一个包含函数)文件名 - apis.js

      export function GetApiCall(apiName, data, header) {
       return new Promise((resolve, reject) => {
          //do something here
        });
       }
      

      我在created钩子中使用了这个函数。 问题是您可以使用其中一种用户定义的方法。

      Vue 文件(我们将从 js 文件中使用该函数的文件) - 文件名 - infoform.vue

       import { GetApiCall } from '../utils/apisget';
        export default{
          created(){
              // Invoked API to get Data of organization
              GetApiCall(URL,{},{
                      "Content-Type": "application/json",
                      "Authorization": 'Bearer ' + token
                  })
                  .then(responseJson => {
                  })
                  .catch(err=>{
                      this.$toasted.show(err);
                      // console.log('error==',err);
                  });
          },
        methods: {
           onClickMethod () {
             GetApiCall(URL,{},{});
           }
        }
      }
      

      【讨论】:

      • 非常感谢您的解释。 =)
      【解决方案6】:

      我创建了"/helpers/modalHelpermodalHelper.js".

      export default function modalHelper() {
         function showModalWithoutBackdrop(modalID) {
            $('#' + modalID).modal({
               backdrop: 'static',
               keyboard: false
            });
         }
      
         function showModal(modalID) {
            $('#' + modalID).modal("show");
         }
      
         function hideModal(modalID) {
            $('#' + modalID).modal("hide");
         }
      
         return {
            showModalWithoutBackdrop,
            showModal,
            hideModal,
         }
      }
      

      用法: 在vue组件脚本部分:

      <script>
          
          import modalHelper from "@/helpers/modalHelpermodalHelper.js"
          
          const {showModal} = modalHelper();
          
          export default {
            methods: {
                showModal,
            }
          }
      <script>
      

      现在我可以在模板中使用这个方法了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-06
        • 2019-09-10
        • 2016-11-07
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        相关资源
        最近更新 更多