【问题标题】:Stripe custom form with Reactjs使用 Reactjs 条带化自定义表单
【发布时间】:2016-03-23 13:58:32
【问题描述】:

在创建自定义表单时,您需要在提交时将表单发送到服务器。这对于 DOM 选择器来说非常简单。这里:

var $form = $('#payment-form');
Stripe.createToken($form, this.stripe_response_handler);

但是在使用 React 时不应该直接尝试修改或访问 DOM。为了克服这个问题,我使用了ref。这里:

<Form onSubmit={this.select_plan} ref={(ref) => this.paymentForm = ref} >
...
</Form>

然后

Stripe.createToken(this.paymentForm, this.stripe_response_handler);

然而这导致了错误:

未捕获的 TypeError:将循环结构转换为 JSON

在 React 中这样做的正确方法是什么?

【问题讨论】:

    标签: javascript jquery reactjs stripe-payments


    【解决方案1】:

    有几种方法可以使用Stripe.js,你可以传递表单DOMElement(你不需要使用ref,因为你可以在e.target事件中从e.target获取表单元素) Stripe的数据属性在哪里

    var StripeComponent = React.createClass({
      componentDidMount: function () {
        Stripe.setPublishableKey(); // set your test public key
      },
    
      handleSubmit: function (e) {
        e.preventDefault();
        Stripe.card.createToken(e.currentTarget, function (status, response) {
          console.log( status, response );      
        });
      },
    
      render: function() {
        return <form method="post" onSubmit={ this.handleSubmit }>
          <input size="20" data-stripe="number" placeholder="number"/>
          <input size="4" data-stripe="cvc" placeholder="cvc" />
          <input size="2" data-stripe="exp-month" placeholder="exp-month" />
          <input size="4" data-stripe="exp-year" placeholder="exp-year" />
          <button type="submit">Pay</button>
        </form>;
      }
    });
    

    Example

    或者您可以像这样创建自定义数据对象

    var StripeComponent = React.createClass({
      getInitialState: function () {
        return {
          card: {
            number: '',
            cvc: '',
            exp_month: '',
            exp_year: ''
          }
        }
      },
    
      componentDidMount: function () {
        Stripe.setPublishableKey(); // set your test public key
      },
    
      handleSubmit: function (e) {
        e.preventDefault();
        Stripe.createToken(this.state.card, function (status, response) {
          console.log( status, response );
        });
      },
    
      handleChange: function (e) {
        let card = this.state.card;
        card[e.target.name] = e.target.value
        this.setState(card);
      },
    
      render: function() {
        return <form onSubmit={ this.handleSubmit }>
          <input size="20" name="number" onChange={this.handleChange} />
          <input size="4" name="cvc" onChange={this.handleChange} />
          <input size="2" name="exp_month" onChange={this.handleChange} />
          <input size="4" name="exp_year" onChange={this.handleChange} />
          <button type="submit">Pay</button>
        </form>
      }
    });
    

    Example

    注意 - 要测试示例,您需要设置公钥

    【讨论】:

    • 完美运行!多谢。 :) 再次抱歉延迟回复。
    猜你喜欢
    • 2023-03-18
    • 2019-10-07
    • 2015-04-11
    • 1970-01-01
    • 2011-04-15
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多