从 Vue 组件内部的 URL 导入 PayPal(或任何其他脚本)

Posted

技术标签:

【中文标题】从 Vue 组件内部的 URL 导入 PayPal(或任何其他脚本)【英文标题】:Importing PayPal (or any other script) from URL inside component in Vue 【发布时间】:2020-03-20 04:43:53 【问题描述】:

我有一个名为 CallToAction 的组件,我想导入 PayPal,使用他们的按钮并用脚本激活它,但我不确定如何从 Vue 组件中的 URL 正确导入脚本(我不想拥有它全局在每个页面上,仅在呈现 CallToAction 组件的页面上导入)。

我已尝试关注,但我无法从该脚本访问变量,即使我可以在 html 中看到它。

<template>
    <div class="paypal-button" id="paypal-plan-container"></div>
</template>

<script>
export default 
    mounted: function() 
        let paypalScript = document.createElement('script')
        paypalScript.setAttribute('src', 'https://www.paypal.com/sdk/js?client-id=sb&vault=true')
        document.head.appendChild(paypalScript)
        paypal.Buttons(
            createSubscription: function(data, actions) 
            return actions.subscription.create(
                'plan_id': 'sb'
            );
            ,
            onApprove: function(data, actions) 
            alert(data.subscriptionID);
            
        ).render('#paypal-plan-container');
    

</script>

给出这个错误ReferenceError: paypal is not defined

【问题讨论】:

您需要等待脚本加载 怎么样?我熟悉 javascript 中的异步操作,但找不到任何适合我的例子。 paypalScript.onload = function() ... do the paypal thing here ... - 我会把那一行放在之前 document.head.appendChild(paypalScript) 明天试试,看起来很有希望。 @Bravo 我使用了 Omar 的完整示例,但您是对的,它需要一些在脚本加载时触发的事件监听器。非常感谢! 【参考方案1】:

这是我使用的组件

<template>
  <div ref="paypal"></div>
</template>

<script>
export default 
  data() 
    return 
      order: 
        description: "Buy thing",
        amount: 
          currency_code: "USD",
          value: 1000
        
      
    ;
  ,
  mounted: function() 
    const script = document.createElement("script");
    const ClientID = "";
    script.src = `https://www.paypal.com/sdk/js?client-id=$ClientID`;
    script.addEventListener("load", this.setLoaded);
    document.body.appendChild(script);
  ,
  methods: 
    setLoaded: function() 
      window.paypal
        .Buttons(
          createOrder: (data, actions) => 
            return actions.order.create(
              purchase_units: [this.order]
            );
          ,
          onApprove: async (data, actions) => 
            const order = await actions.order.capture();
            // ajax request
          ,
          onError: err => 
            console.log(err);
          
        )
        .render(this.$refs.paypal);
    
  
;
</script>

【讨论】:

非常感谢!所以我错过了事件监听器并通过窗口访问贝宝变量。它现在完美无缺。 经过小的修改后它对我有用。 “addEventListener”需要一个回调,所以应该是:script.addEventListener("load", () =&gt; this.setLoaded );【参考方案2】:

当脚本希望直接包含在页面中时,可能值得寻找一个 vue 包装器来处理通过 vue 组件加载它的问题。 this 是你需要的吗?

【讨论】:

我以前发现过这个,但它似乎没有订阅我已经在 PayPal 上创建的产品。

以上是关于从 Vue 组件内部的 URL 导入 PayPal(或任何其他脚本)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Vue.js 类组件设置 PayPal 智能按钮

Vue 组件库 - 无法从 dist 导入

无法从 Vue.js 中的单个文件组件导入 Mixin

vue-cli 如何从组件构建一个库并导入它?

React 组件模块(从本地 repo 导入)导致错误“只能在函数组件的主体内部调用 Hooks。”

Vue-loader 语法错误:从 js 文件导入组件时出现意外的令牌