Stripe Elements React - 如何从父组件获取条带数据?

Posted

技术标签:

【中文标题】Stripe Elements React - 如何从父组件获取条带数据?【英文标题】:Stripe Elements React - how to get stripe data from parent component? 【发布时间】:2018-11-05 20:21:33 【问题描述】:

我已经在_CardForm 组件中设置了Stripe 元素支付表单,并希望在Checkout 组件中执行支付流程,该组件是_CardForm 的父组件。

但是,我无法从_CardForm 组件中获取条带数据。如何从子组件中获取条带数据?

const 
  CardElement,
  StripeProvider,
  Elements,
  injectStripe,
 = ReactStripeElements

class _CardForm extends React.Component 
  render() 
    return (
      <form onSubmit=this.props.userPay>
        <CardElement />
        <button>Pay</button>
      </form>
    )
  

const CardForm = injectStripe(_CardForm)

class Checkout extends React.Component 
  userPay()
    // PROBLEM: Can't get stripe data from <CardElement />
    console.log(this.props.stripe) // undefined
    this.props.stripe.createToken().then(payload => console.log(payload))
  
  render() 
    return (
      <div className="Checkout">
        <h1>Available Elements</h1>
        <Elements>
          <CardForm userPay=this.userPay.bind(this) />
        </Elements>
      </div>
    )
  


const App = () => 
  return (
    <StripeProvider apiKey="pk_RXwtgk4Z5VR82S94vtwmam6P8qMXQ">
      <Checkout />
    </StripeProvider>
  )

ReactDOM.render(<App />, document.querySelector('.App'))

【问题讨论】:

【参考方案1】:

这段代码对我来说很难测试,但它应该可以清除文档中未显示的一些内容。

此外,毫无疑问,您首先必须正确加载 Stripe。我也可以在该领域提供一些指示,但我需要了解更多有关您如何尝试加载它的信息。

const 
  CardElement,
  StripeProvider,
  Elements,
  injectStripe,
 = ReactStripeElements

class CardForm extends React.Component 
  render() 
    return (
      <form onSubmit=this.props.userPay>
        <CardElement onReady=this.props.cardRef />
        <button>Pay</button>
      </form>
    );
  


class Checkout extends React.Component 
  userPay = (event) => 
    const testName = "John Doe";

    if (this.cardElement) 
      this.props.stripe
        .createToken(
          this.cardElement,
           name: testName  // add additional information here, such as name and address, if outside card element
        )
        .then(( token ) => 
          const tokenString = token.id; // you actually want token.id to send to your server and then to the stripe API
          // code to send tokenString to your server, which will then send it to stripe's API
        );
    
  ;

  cardRef = (element) => 
    if (element) 
      this.cardElement = element;
    
  ;

  render() 
    return (
      <div className="Checkout">
        <h1>Available Elements</h1>
          <CardForm
            cardRef=this.cardRef
            userPay=this.userPay
          />
      </div>
    );
  


const StripeCheckout = injectStripe(Checkout);

const App = () => 
  return (
    <StripeProvider apiKey="pk_RXwtgk4Z5VR82S94vtwmam6P8qMXQ">
        <Elements>
          <StripeCheckout />
        </Elements>
    </StripeProvider>
  );
;
ReactDOM.render(<App />, document.querySelector('.App'))

【讨论】:

感谢您的回答。我正在尝试这个,但似乎没有工作。首先,将injectStripe 移动到injectStripe(Checkout); 会给我一条错误消息,上面写着injectStripe is outside of &lt;Elements&gt; userSingup 函数中,console.log(this.cardElement) 显示t _emit: ƒ, _once: ƒ, _removeAllListeners: ƒ, _on: ƒ, _userOn: ƒ, …,但console.log(this.props.stripe) 仍显示undefined @Ohsik 对此感到抱歉。我可以肯定地通过上面的编辑解决第一个错误。 this.props.stripe 应该在那之后出现。 是的,它现在出现了!谢谢你。我还有一个问题。通过这样做,我将&lt;Elements&gt; 包裹在&lt;App /&gt; 组件周围,看起来像ReactDOM.render( &lt;Provider store=store&gt; &lt;StripeProvider apiKey="pk_RXwtgk4Z5VR82S94vtwmam6P8qMXQ"&gt; &lt;Elements&gt; &lt;App /&gt; &lt;/Elements&gt; &lt;/StripeProvider&gt; &lt;/Provider&gt;, document.getElementById('root') ); 可以吗?或者我应该将&lt;StripeProvider /&gt; and &lt;Elements&gt; 移动到我的路线,它是App 组件的子路线。 @Ohsik 你可以随心所欲地往上走——只要你上面的injectStripe。 Stripe 建议您往上走。他们说他们可以通过这种方式更好地监控一切。再说一次,如果不需要,为什么要加载这些条带组件。由你决定。在我的实现中,我使用您的术语将其添加到子路由而不是 App。

以上是关于Stripe Elements React - 如何从父组件获取条带数据?的主要内容,如果未能解决你的问题,请参考以下文章

Stripe Elements React - 如何从父组件获取条带数据?

如何在 React 测试中加载 Stripe?

在Stripe + React中发生无效的挂钩调用错误

php [Stripe]使用`wc_stripe_elements_styling`过滤器添加自定义条纹元素样式。

如何使用 Elements 将持卡人姓名添加到 Stripe 结账?

如何使用 Bootstrap 设置 Stripe Elements 输入的样式?