背景:
致力于 Cybersource 信用卡与 React 应用程序的集成。需要显示来自 API 响应的屏蔽卡号(onBlur
在字段的选项卡上)。
流动
创建了一个容器 div,在其中加载了 IFrame,我输入了 CC 编号。在
blur
事件中,执行 API 调用以进行验证并获取屏蔽卡号(如果成功验证)。设置后
maskedCardNumber
,组件会重新渲染并在容器 div 中显示 maskedCardNumber。此时我在 Elements 选项卡中看到,IFrame消失了,这对我来说非常好。现在在我的容器 div 中没有 IFrame,而是一个蒙面的卡号。
我想更改抄送号码
- 我单击输入相似的 div并且由于
setMaskedCardNumber("");
. (不是每个字符一个一个,而是一次一个,因为我们没有那个卡号)。到此为止,一切都很好。
问题
删除后,它应该显示新的 Iframe,因为我loadIFrame();
像初始 Iframe 加载一样调用,但奇怪的是它直到我单击AGAIN才显示。是的!!你没看错。我需要再次单击以加载和 IFrame,这对我来说很奇怪。
到目前为止尝试过
useState()
,useReducer()
,<label>{maskedCardNumber}</label>
在容器 div 内制作。- 将 conatiner-div 更改
<div>
为<input>
相关代码
useEffect(() => {
if (apiKey) {
loadIFrame();
}
}, [apiKey])
const loadIFrame = () => {
let flex;
flex = new Flex(apiKey);
let microform = flex.microform();
let number = microform.createField('number', {
placeholder: 'Enter card number'
});
number.on('load', () => {
number.focus();
});
number.on('blur', () => {
//transient token call
microform.createToken({}, function(err, token) {
if (err) {
console.error(err);
setCardError({
...error,
token: "Please enter valid CC number"
})
} else {
setCardError({
...error,
token: ""
});
//permenant token call
setMaskedCardNumber(JSON.parse(atob(token.split('.')[1]))["data"]["number"]);
dispatch({
type: orderActions.GET_CC_TOKEN,
transientToken: JSON.parse(atob(token.split('.')[1]))['jti'],
callbacks: {
success: (ccToken) => {
updateCardDetail({
type: "token",
token: ccToken
})
},
failure: (err) => {
console.error(err);
setCardError({
...error,
token: "Please enter valid CC number"
})
}
}
})
}
})
});
number.load('#number-container');
}
<div id="number-container" className="form-control" onClick={() => {
setMaskedCardNumber("");
loadIFrame();
}}>
{maskedCardNumber}
</div>