在React中如何订阅Recurly.js checkout定价相关事件?
解决方案
你遇到的核心原因是useCheckoutPricing返回的checkoutPricing实例会在每次价格计算状态更新时生成新的引用,你之前的写法既没有解绑旧实例的事件,也不符合react-recurly的封装设计。
方案1:优先使用官方封装的响应式状态(推荐)
react-recurly已经把所有常用的变更封装到了返回的price状态中,你不需要手动监听原生事件,直接监听price.plan的变化即可实现需求:
const [{ price, loading }, setPricing, checkoutPricing] = useCheckoutPricing( null, setRecurlyError ); useEffect(() => { if (price?.plan) { console.log("plan updated", price.plan); // 此处写入套餐变更后的业务逻辑 } }, [price?.plan]);
这种写法完全符合React的响应式开发范式,不需要处理实例的绑定解绑逻辑,稳定性更高。
方案2:如果必须使用原生事件监听
如果你有特殊场景必须用到原生的set.plan事件,需要在useEffect的销毁回调中解绑旧事件,避免内存泄漏和无效绑定:
const [{ price, loading }, setPricing, checkoutPricing] = useCheckoutPricing( null, setRecurlyError ); useEffect(() => { // 实例不存在时直接返回 if (!checkoutPricing) return; const handlePlanSet = (plan) => { console.log("plan updated", plan); }; checkoutPricing.on("set.plan", handlePlanSet); // 重点:实例更新/组件卸载时解绑事件 return () => checkoutPricing.off("set.plan", handlePlanSet); }, [checkoutPricing]);
额外说明
你之前的写法没有做事件解绑,旧实例销毁后绑定的事件会直接失效,新实例生成后如果触发变更的逻辑是生成新实例而不是在原实例上触发事件,就会出现回调完全不触发的情况,优先使用方案1即可解决问题。
内容的提问来源于stack exchange,提问作者JKasper11
相关产品推荐
相关产品推荐

