返回题库题目
一个 DApp 在连接成功时上报埋点并刷新服务端会话;上线后发现刷新页面会重复上报,切换账户后服务端权限仍停留在旧地址。请说明连接状态变化的副作用应该放在哪里,以及边界怎么划。
考察目标
- useConnectionEffect 的回调与触发条件。
- 重连与首次连接的区分方式。
- 服务端会话与连接状态的解耦。
查看参考答案包含简要回答、深入分析、常见错误与评分标准+
30 秒回答
useConnectionEffect 提供 onConnect 与 onDisconnect 回调:onConnect 的数据包含地址、链、connector 与 isReconnected 标记,onDisconnect 在不再存在连接时触发。useConnection 的 status 取值包括 connecting、reconnecting、connected 与 disconnected,文档说明可以用 status 收窄返回类型。因此连接副作用的语义要区分首次连接与重连,服务端会话则需要在切号与断连时重新验证。实现差异与工程取舍见深入回答。
深入回答
- 【实现行为】useConnectionEffect 的参数包含 onConnect 与 onDisconnect 回调(依据:wagmi useConnectionEffect §Parameters 的 onConnect、onDisconnect)。
- 【实现行为】onConnect 的数据包含 address、addresses、chain、chainId、connector 与 isReconnected 标记(依据:wagmi useConnectionEffect §Parameters 的 onConnect 类型说明)。
- 【实现行为】onDisconnect 在不再存在连接时触发(依据:wagmi useConnectionEffect §Parameters 的 onDisconnect 说明)。
- 【实现行为】useConnection 的 status 取值为 connecting、reconnecting、connected、disconnected,文档说明可以用它收窄返回类型(依据:wagmi useConnection §Return Type 的 status)。
- 【工程经验】用 isReconnected 区分重连与首次连接,避免刷新页面时重复上报或重复提示(依据:wagmi useConnectionEffect §Parameters 的 onConnect;工程经验)。
- 【工程经验】回调里避免做阻塞渲染的长任务,副作用交给独立服务层或任务队列(工程经验,无规范依据)。
- 【工程经验】依赖字段要精确:把回调依赖收敛到真正需要的字段,减少重复触发(工程经验,无规范依据)。
- 【工程经验】服务端会话与连接状态解耦:切号、断连与授权撤销后重新验证,权限不跟随本地地址缓存(工程经验,无规范依据)。
- 【工程经验】断连时清理与旧账户绑定的表单、待签内容与缓存(工程经验,无规范依据)。
常见错误
- 把重连当成新连接,重复上报埋点(【实现行为】onConnect 数据带有 isReconnected 标记;依据:wagmi useConnectionEffect §onConnect)。
- 在回调里 setState 触发循环渲染(【工程经验】)。
- 连接后不更新服务端会话,切号后权限停留在旧地址(【工程经验】)。
- 依赖整个回调对象导致频繁重跑(【工程经验】)。
- 只监听连接不监听断开,旧状态长期残留(【实现行为】onDisconnect 在无连接时触发;依据:wagmi useConnectionEffect §onDisconnect)。
面试官追问
- 刷新页面触发的重连,应该上报为连接事件吗?
- 回调中发起网络请求时,如何避免重复与竞态?
- 切号之后,服务端会话应该在什么时机失效?
- 把副作用放在组件里与放在独立层,取舍分别是什么?
- 多连接环境下,onDisconnect 的触发条件意味着什么?
评分标准
初级回答
- 知道 useConnectionEffect 提供 onConnect 与 onDisconnect 回调。
- 知道连接状态包含重连与已连接等取值。
- 能用 isReconnected 区分重连并避免重复副作用。
- 能说明切号与断连时服务端会话需要重新验证。
高级回答
- 能设计副作用分层方案,覆盖埋点、会话与缓存清理的时机。
- 能说明多连接场景下事件语义的变化与验证方式。
参考资料
发现这道题有问题? 反馈此题