微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于支付的 react-stripe-js 按钮始终处于禁用状态

如何解决用于支付的 react-stripe-js 按钮始终处于禁用状态

我正在尝试遵循 react-stripe-js 文档中的基本示例,但是,我遇到了一个我已经有一段时间无法弄清楚的问题。

我的条纹“付款”按钮始终处于禁用状态,即使我输入从条纹测试页面获得的信息 - https://stripe.com/docs/testing

我的组件:

CheckoutForm 和 InjectedCheckoutForm

import React from 'react';
import ReactDOM from 'react-dom';
import {loadStripe} from '@stripe/stripe-js';
import {CardElement,Elements,ElementsConsumer} from '@stripe/react-stripe-js';


class CheckoutForm extends React.Component {
  handleSubmit = async (event) => {
    event.preventDefault();
    const {stripe,elements} = this.props;
    const {error,paymentMethod} = await stripe.createPaymentMethod({
      type: 'card',card: elements.getElement(CardElement),});
  };

  render() {
    const {stripe} = this.props;
    return (
      <form onSubmit={this.handleSubmit}>
        <CardElement/>
        <button type="submit" disabled={!stripe}>
          Pay
        </button>
      </form>
    );
  }
}

export const InjectedCheckoutForm = () => (
  <ElementsConsumer>
    {({stripe,elements}) => (
      <CheckoutForm stripe={stripe} elements={elements} />
    )}
  </ElementsConsumer>
);

export default CheckoutForm;

ViewMembers.js 可以很好地呈现 Elements 和 Injected Checkout 表单。

我对 ViewMembers 组件进行了一些更改以尝试新的内容。我将一个状态值设置为 null,并且在生命周期方法 componentDidMount() 中,我正在从条带中分配我正在使用的 promise 对象,现在当我为这个状态值执行 console.log() 时,我也得到了兑现了承诺,但由于某种原因,这个承诺没有作为道具发送到我的 Elements 组件,因为我在 CheckOutForm 中的按钮仍然被禁用。 *另一个编辑。

实际上,promise 对象正在发送,我可以在使用 React Dev Debug 工具时看到我的 API 密钥,但是即使 stripe 的 prop 接收到正确的值,按钮仍然处于禁用状态。

class ViewMembers extends React.Component {
 
    constructor(props) {
        super(props)
        this.state = {
            members: [],isModalClicked: false,isModalClickedEdit: false,emptyList: false,id: 0,showStripe: false,stripePromise: null
 
 
        }
 
        this.openModal = this.openModal.bind(this);
        this.closeModal = this.closeModal.bind(this);
        this.openMoDaledit = this.openMoDaledit.bind(this);
        this.closeMoDaledit = this.closeMoDaledit.bind(this);
    }
 
    openModal(e) {
        e.preventDefault();
        console.log("the modal is being opened");
        this.setState({
            isModalClicked: true,},() => {
            console.log("this state id",e.target.value);
            console.log("this state id",this.state.id);
        })
    }
 
 
    openMoDaledit(e) {
 
        e.preventDefault();
        console.log("Edit modal is being opened");
        this.setState({
            isModalClickedEdit: true,id: e.target.value
        },this.state.id);
            console.log("this state id",this.state.id);
        })
    }
    closeMoDaledit(e) {
        e.preventDefault();
        console.log("Edit modal is being closed");
        this.setState({
            isModalClickedEdit: false
        })
    }
    closeModal(e) {
        e.preventDefault();
        console.log("The modal is being closed");
        this.setState({
            isModalClicked: false
        })
    }
    fetchingMembers = () => {
        var id = this.props.id;
        console.log("this props",this.props.id);
 
        axios.get(`https://localhost:44345/api/gyms/${id}/members/`)
            .then(res => {
                const members = res.data;
                this.setState({ members });
                console.log("Members",members);
 
            })
            .catch(err => {
                console.log(err);
            })
    }
 
    openPaymentStripe = (e) =>{
        e.preventDefault();
 
 
        this.setState({ showStripe: true })
 
 
    }
    async componentDidMount() {
        this.fetchingMembers();
        const stripePromise = await loadStripe('stripekey');
 
        console.log('stripe promise',stripePromise)
        this.setState({
            stripePromise: stripePromise
        })
    }
 
 
 
 
    componentDidUpdate(prevProps) {
        if (this.props.id !== prevProps.id) {
            axios.get(`https://localhost:44345/api/gyms/${this.props.id}/members/`)
                .then(res => {
                    const members = res.data;
                    this.setState({ members });
 
                    console.log("members",members);
                })
                .catch(err => {
                    console.log(err);
                })
        }
    }
 
 
    renderTableData() {
        if (this.state.members) {
            return this.state.members.map((member) => {
                return (
                 <TableRow key={member.id}>
                        <TableCell>
                            <label for="memberName">Member Name: {member.memberName}</label>
                        </TableCell>
                        <TableCell>
                            <label for="memberName">Member SurName: {member.memberSurName}</label>
                        </TableCell>
                        <TableCell>
                            <label for="memberName">Member Active Status: {member.isActive.toString()}</label>
                        </TableCell>
                        <TableCell>
                            <button value={member.memberID} onClick={this.openMoDaledit}>Edit Member</button>
                            {/* <EditMember  isModalClickedEdit={this.state.isModalClickedEdit} takeClickEdit={this.closeMoDaledit} GymId={this.props.id} MemberId={this.state.id}/> */}
                        </TableCell>
                        <TableCell>
                            <button value={member.memberID} onClick={this.openModal}>Add Member</button>
                            <AddMember isModalClicked={this.state.isModalClicked} isModalHidden={this.state.isModalClicked} takeClick={this.closeModal} GymId={this.props.id} onAddMember={this.fetchingMembers}/>
                        </TableCell>
                    </TableRow>
                )
            })
        }
}
 
render() {
 
 
       if (this.state.isModalClickedEdit){
           return (
               <EditMember  isModalClickedEdit={this.state.isModalClickedEdit} takeClickEdit={this.closeMoDaledit} GymId={this.props.id} MemberId={this.state.id} onEditMember={this.fetchingMembers}/>
           )
       }
 
 
       if (this.state.showStripe){
       const stripePromiseData = this.state.stripePromise;
       console.log('stripePromiseData',stripePromiseData)
 
        return (
            <>
                <Elements stripe={stripePromiseData}>
                    <InjectedCheckoutForm />
                </Elements>
 
            </>
          )
    }
 
 
 
    const emptyList = this.state.members.length;
 
        if (emptyList == 0){
            return (
                <>
                <CircularProgress color="secondary"/>
                <button onClick={this.openModal}>Add Member</button>
                <br/>
                <br/>
 
                <button color="primary" onClick={this.openPaymentStripe}>Purchase Membership</button>
                <AddMember isModalClicked={this.state.isModalClicked} isModalHidden={this.state.isModalClicked} takeClick={this.closeModal} GymId={this.props.id} onAddMember={this.fetchingMembers}/>
                </>
              )
        }
 
        return (
            <div class="container" className="listofGyms">
                <div class="row">
                    <div class="col-sm-6">
                        <h2>List of Members</h2>
                    </div>
                </div>
                <Table id='gyms' class="table table-purple">
                    <TableBody>
                        {this.renderTableData()}
                    </TableBody>
                </Table>
                <button color="primary" onClick={this.openPaymentStripe}>Purchase Membership</button>
            </div>
 
        )
 
 
    }
}
 
 
export default ViewMembers;```

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。