You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新pusher-js后React的setState无法正常工作?求排查

问题排查与修复方案

核心问题分析

  1. Pusher绑定位置错误
    直接在组件顶层编写Pusher订阅逻辑,会导致组件每次渲染都重复订阅绑定,而且回调函数会捕获初始渲染的闭包(虽setOrderStatus是稳定的,但重复绑定会引发多次触发问题),无法保证订阅逻辑只执行一次。

  2. 普通变量无法触发重渲染
    let test = 'approved'是普通JavaScript变量,修改它不会触发React组件重新渲染。而且每次组件渲染时,这个变量都会被重新声明并赋值为初始值,你在Pusher回调里修改的值会被立即覆盖,JSX中永远看不到更新。

  3. useEffect内变量名拼写错误
    第二个useEffect里用了orderState,但你的状态变量实际是orderStatus,变量名不匹配导致整个逻辑分支完全不会执行,这也是状态更新后没有预期行为的关键原因。

修复后的代码示例

const [orderStatus, setOrderStatus] = useState('approved');
// 将test改为React状态变量,确保修改后能触发重渲染
const [test, setTest] = useState('approved');

useEffect(() => {
  // 将Pusher订阅逻辑放入useEffect,确保仅在组件挂载时执行一次
  const targetChannel = pusher.subscribe(channel);
  const handleOrderUpdate = (message: any) => {
    setOrderStatus(message.status);
    setTest(message.status);
    console.log('socket message', message.status);
  };
  
  targetChannel.bind('order.updated', handleOrderUpdate);

  // 组件卸载时解绑事件、取消订阅,避免内存泄漏
  return () => {
    targetChannel.unbind('order.updated', handleOrderUpdate);
    pusher.unsubscribe(channel);
  };
}, []);

useEffect(() => {
  // 修正变量名为orderStatus,匹配状态变量
  switch (orderStatus) {
    case 'pending':
      setPopup('WFP');
      break;
    case 'approved':
      navigation.navigate('OrderPage', {
        method: transferMethodType,
        type: 'Confirm',
      });
      break;
    case 'deal':
      setPopup('RAN');
      break;
    case 'segmentationSubmitted':
      navigation.navigate('AccountNumbers', { method: transferMethodType });
      break;
    default:
      setPopup(null);
  }
}, [orderStatus, navigation, transferMethodType]); // 仅依赖必要的状态和函数

内容的提问来源于stack exchange,提问作者Maryam Alishahi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:54:52