reactjs useEffect未使用axios请求更新PayPal客户ID [重复]

pn9klfpd  于 2023-01-08  发布在  React
关注(0)|答案(1)|浏览(89)
    • 此问题在此处已有答案**:

The useState set method is not reflecting a change immediately(16个答案)
13小时前关门了。
有时候看起来最简单的东西都不起作用了。我向我的API发出GET请求来获取paypal_client_id,但是它没有及时更新。

import { useState } from 'react';
import axios from 'axios';
import { useEffect } from 'react';

const PayPalButton = ({ total, onPaymentSuccess, onPaymentError, disabled }) => {
  const [paypalClient, setPayPalClient] = useState('test-id');

  useEffect(() => {
    const paypalkey = async () => {
      const { data: clientId } = await axios.get('/api/config/paypal');
      setPayPalClient(clientId);
      console.log(paypalClient);
    };
    paypalkey();
  }, []);
  return (
    <PayPalScriptProvider options={{ 'client-id': paypalClient }}>
      <PayPalButtons
        disabled={disabled}
        forceReRender={[total()]}
        createOrder={(data, actions) => {
          return actions.order.create({
            purchase_units: [
              {
                amount: {
                  value: total(),
                },
              },
            ],
          });
        }}
        onApprove={(data, actions) => {
          return actions.order.capture().then((details) => {
            onPaymentSuccess(data);
          });
        }}
        onError={(err) => {
          onPaymentError();
        }}
      />
    </PayPalScriptProvider>
  );
};

export default PayPalButton;

我以为我的useEffect钩子会及时提供paypal_client_id,但它不起作用。
API是工作,但请求贝宝做认证按钮是做它与'test-id',这证明我的关键是没有及时到达.
任何帮助都将不胜感激。

xfb7svmp

xfb7svmp1#

useEffect在第一次渲染时触发,因此客户端ID不在"正确的时间"是"正常的"。
应该在渲染中加载以防止出现这种情况。
例如:

const [paypalClient, setPayPalClient] = useState('');
    
        return (
            {!paypalClient ? <p>Loading...</p> : 
(<PayPalScriptProvider options={{ 'client-id': paypalClient }}>
              <PayPalButtons
                disabled={disabled}
                forceReRender={[total()]}
                createOrder={(data, actions) => {
                  return actions.order.create({
                    purchase_units: [
                      {
                        amount: {
                          value: total(),
                        },
                      },
                    ],
                  });
                }}
                onApprove={(data, actions) => {
                  return actions.order.capture().then((details) => {
                    onPaymentSuccess(data);
                  });
                }}
                onError={(err) => {
                  onPaymentError();
                }}
              />
            </PayPalScriptProvider>)}
          );

或者,您可以简单地将client-id存储在环境变量中

相关问题