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

如何利用Supabase Realtime更新前端在线人数及昵称展示?

更简便的Supabase实时在线玩家实现方案

你的实现思路没问题,但确实有更简洁的方式来优化代码逻辑和初始渲染的问题,分两部分说明:

1. 拆分事件监听,避免繁琐的eventType判断

不用监听所有事件(event: '*')再做分支判断,直接为INSERT和DELETE分别注册回调,代码更直观:

const playersChannel = supabase.channel('players-online-channel')
  // 处理新玩家上线
  .on(
    'postgres_changes',
    { event: 'INSERT', schema: 'public', table: 'players_online' },
    (payload) => {
      // 直接用payload.new更新状态,比如添加到玩家列表
      setOnlinePlayers(prev => [...prev, payload.new])
    }
  )
  // 处理玩家下线
  .on(
    'postgres_changes',
    { event: 'DELETE', schema: 'public', table: 'players_online' },
    (payload) => {
      // 用payload.old的主键过滤移除
      setOnlinePlayers(prev => prev.filter(p => p.id !== payload.old.id))
    }
  )
  .subscribe()

这样每个回调只负责单一事件逻辑,不用写一堆if判断,可读性和维护性都更好。

2. 合并初始数据获取与实时监听

实时订阅本身只会推送变更事件,不会返回已有数据,所以初始渲染确实需要先拉取一次数据,但可以把这两步整合得更流畅:

// 初始化函数,放在组件挂载或页面加载逻辑里
async function initOnlinePlayers() {
  // 1. 先获取当前所有在线玩家的初始数据
  const { data: initialPlayers, error } = await supabase
    .from('players_online')
    .select('*')

  if (error) {
    console.error('加载初始在线玩家失败:', error)
    return
  }

  // 2. 初始化状态
  setOnlinePlayers(initialPlayers)

  // 3. 启动实时监听
  supabase.channel('players-online-channel')
    .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'players_online' }, (payload) => {
      setOnlinePlayers(prev => [...prev, payload.new])
    })
    .on('postgres_changes', { event: 'DELETE', schema: 'public', table: 'players_online' }, (payload) => {
      setOnlinePlayers(prev => prev.filter(p => p.id !== payload.old.id))
    })
    .subscribe()
}

// 调用初始化
initOnlinePlayers()

另外别忘了在组件卸载/页面关闭时取消订阅,防止内存泄漏:

// 比如在React的useEffect清理函数里
useEffect(() => {
  initOnlinePlayers()
  return () => {
    supabase.channel('players-online-channel').unsubscribe()
  }
}, [])

额外提示

如果你的players_online表还有UPDATE场景(比如玩家昵称修改),同样可以单独注册UPDATE事件的回调,逻辑保持一致即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 02:50:29