javascript - 等待在 nextjs 页面加载 paypal 脚本

标签 javascript reactjs paypal next.js server-side-rendering

我有这段代码应该呈现 PayPal 按钮。

    <Head>
      <script src="https://www.paypal.com/sdk/js?client-id=KEY"></script>
    </Head>

我在 componentDidMount 方法中加载 PayPal 按钮

componentDidMount() {
    paypal
.Buttons({
  createOrder: (data, actions)=> {
    return actions.order.create({
      purchase_units: [{
          amount: {
            currency_code: "USD",
            value: amount,
          },
        }],
    });
  },
  onCancel: function(data){
    //console.log(data)

  },
  onError: function(err){
    console.log(err)
  }
})
.render("#paypal");
 }




<div id="paypal" className=""></div>

在第一个页面加载时,页面抛出一​​个错误,我猜 PayPal is not defined 我猜是因为调用 componentDidMount 方法时脚本没有完全加载。 我如何才能等到脚本加载完毕才能正确呈现按钮?

最佳答案

const addPayPalScript = () => {
    const script = document.createElement("script");
    script.type = "text/javascript";
    script.src = `https://www.paypal.com/sdk/js?client-id=${process.env.PAYPAL_CLIENT_ID}`;
    // script.setAttribute("data-namespace", "paypal_sdk");

    script.async = true;
    script.onload = () => {
      setSdkReady(true);
    };
    document.body.appendChild(script);
  };

script.onload 将标记它已准备就绪。跟踪它的使用状态

   const [sdkReady, setSdkReady] = useState(false);

然后在 useEffect 或 componentDidMount 中调用 addPayPalScript。我使用 useEffect

useEffect(() => {
dispatch(orderDetailRequestStart(paramsId));

  if (!window.paypal) {
    addPayPalScript();
  } else {
    // flags that it is ready
    setSdkReady(true);
  }

}, []);

关于javascript - 等待在 nextjs 页面加载 paypal 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61778707/

相关文章:

javascript - CSS 悬停效果仅在点击时生效

javascript - 如何将子级和孙级 json 数据附加到 TreeView 结构中

css - 如何在具有多个元素的 flexbox 中将单个元素居中?

ruby-on-rails-4 - NO_API_ACCESS_TO_RECEIVER 在沙盒账户 paypal 中

paypal - 刷卡硬件支付系统是特定的吗?

android - 自定义paypal android sdk源码

javascript - 如何使用 Jest 测试对象键和值是否相等?

javascript - jQuery类发生变化时,如何给元素的css属性添加动画?

reactjs - Redux - 可以将 props 传递给子容器组件吗?

javascript - Webpack - [HMR] 热模块替换被禁用