PayPal React 在更改金额后显示额外的按钮

IT技术 reactjs paypal paypal-sandbox paypal-rest-sdk
2021-05-10 19:28:02

没有 react-paypal-button-v2 ~~~有 60KB 的开销

类似的问题在这里,但他们建议react-paypal-button-v2

我正在尝试制作一个 React PayPal 按钮来更改props更改的账单金额。

我使用props价格调用以下组件,每次价格更改时,我都想重新渲染按钮以更新实际价格。没有 react-paypal-button-v2

const PaypalForm = props => {
  let paypalRef = useRef();

  useEffect(() => {      
    window.paypal
      .Buttons({
        createOrder: (data, actions) => {
          return actions.order.create({
            purchase_units: [
              {
                description: "test",
                amount: {
                  currency_code: "USD",
                  value: props.price
                }
              }
            ]
          });
        },
        onApprove: async (data, actions) => {
          const order = await actions.order.capture();
          console.log(order);
        },
        onError: err => {
          setError(err);
          console.error(err);
        }
      })
      .render(paypalRef.current);
  }, [props.price]);

  return (
    <Row className="justify-content-center">
      {error && <div>Uh oh, an error occurred! {error.message}</div>}
      <div ref={paypalRef} />
    </Row>
  );
};

除了在每次props更改时创建一个新按钮并在旧按钮的底部添加一个新按钮外,一切正常。我想用我的新按钮代替旧按钮。不使用 react-paypal-button-v2

1个回答

就像是:

useEffect(() => {
    if(window.myButton) window.myButton.close();
    window.myButton = window.paypal
      .Buttons({
        createOrder: (data, actions) => {
          return actions.order.create({
            purchase_units: [
              {
                description: "test",
                amount: {
                  currency_code: "USD",
                  value: props.price
                }
              }
            ]
          });
        },
        onApprove: async (data, actions) => {
          const order = await actions.order.capture();
          console.log(order);
        },
        onError: err => {
          setError(err);
          console.error(err);
        }
      });
    window.myButton.render(paypalRef.current);

但是,你真的需要重新渲染对价格变化的按钮!

你可以做value: document.getElementById('...').value或类似的(或任何你需要的变量或函数调用)

在您的示例中,如果props.price单击按钮时返回(新/当前)所需值,则将使用该值。

基本上,createOrder您单击按钮之前不会调用函数。