背景:
致力于Cybersource信用卡与React应用程序的集成。在弹出字段(onBlur
(时,需要显示来自API响应的屏蔽卡号。
流量
-
创建了一个容器div,在其中加载IFrame并输入CC编号。在
blur
事件中,执行API调用以进行验证并获取屏蔽的卡号(如果成功验证(。 -
设置
maskedCardNumber
后,组件将被重新渲染,并在container-div中显示maskedCardNumber。在这一点上,我在元素选项卡中看到,IFrame已经不见了,这对我来说非常好。现在在我的容器div中没有IFrame,只有一个掩码卡号。
我想更改CC编号
- 我点击输入类似的div,由于
setMaskedCardNumber("");
,屏蔽卡号被删除。(不是每个字符一个接一个,而是一次全部输入,因为我们没有那个卡号(。到目前为止一切都很好
问题
删除后,它应该显示新的Iframe,因为我调用loadIFrame();
,就像我在初始Iframe加载时一样,但奇怪的是,直到我再次单击,它才显示。是的!!你读对了。我需要再次点击加载和IFrame,这对我来说很奇怪。
目前已尝试
- CCD_ 6
- CCD_ 7
- 使CCD_ 8在container-div
- 将控制器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>
我在这里看到的问题基本上是,由于iFrame的异步特性,在加载iFrame后,对setMaskedCardNumber()
调用的响应会返回。
试着把这个效果
useEffect(()=>{
if(maskedCardNumber === ""){
loadIFrame()
}
}, [maskedCardNumber])
并从onClick()
处理程序中删除loadIFrame();
这将确保无论何时清空cardNumber状态,iFrame都会在成功清空时加载。
更新:
我们可以使用单个CCD_ 14。
useEffect(() => {
if (apiKey && !maskedCardNumber) {
loadIFrame();
}
}, [apiKey, maskedCardNumber])
有了这个,我们可以确保只有在apiKey存在的情况下才加载IFrame,否则不要尝试加载,因为IFrame依赖于apiKey。