告别服务端渲染卡顿!useSyncExternalStore 优化水合作用全解析

You may be looking for a useSyncExternalStore | Swizec Teller

使用 useEffect 订阅事件然后修改 state,返回 state,在客户端这做是可以的,如果使用服务端渲染就会传卡顿现象,解决方案使用 useSyncExternalStore

js 复制代码
function useSomeValue() {
  const [value, setValue] = useState(0)

  useEffect(() => {
    const eventSource = getEventSource()
    eventSource.subscribe((val) => setValue(val))

    return () => {
      eventSource.unsubscribe()
    }
  }, [])

  return value
}

上面的 gif 中看到的是一个缓慢的水合作用过程。

  • 在服务器上渲染组件
  • 无法订阅浏览器事件
  • HTML 出现在浏览器中
  • 水合作用
  • 展示运行效果
  • 订阅浏览器事件
  • 更新状态
  • 并渲染了组件
js 复制代码
const eventSource = getEventSource()

function subscribe(callback) {
  eventSource.onChange(callback)
  return () => {
    eventSource.unsubscribe(callback)
  }
}

function useSomeValue() {
  const value = useSyncExternalStore(
    subscribe,
    () => eventSource.currentValue(),
    () => defaultValue
  )

  return value
}
相关推荐
Ruihong21 小时前
Vue withDefaults 转 React:VuReact 怎么处理?
vue.js·react.js·面试
用户298698530141 天前
在 React 中使用 JavaScript 将 Excel 转换为 SVG
前端·javascript·react.js
小林攻城狮2 天前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦2 天前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈
张元清2 天前
React useIntersectionObserver Hook:懒加载与可见性检测(2026)
javascript·react.js
用户298698530142 天前
在 React 中使用 JavaScript 将 Excel 转换为 PDF
javascript·react.js·webassembly
木木剑光2 天前
我开源了一个 React 组件库,沉淀了多个高频组件和实用 Hooks
前端·javascript·react.js
Csvn2 天前
React 19 `use()` 来了:以后数据加载可以不用 useEffect?
前端·react.js
许我半盏清茶2 天前
前端路由:理解 hash 路由和 history 路由原理
前端·react.js
老王以为3 天前
React Renderer 分离的多平台架构
前端·react native·react.js