告别服务端渲染卡顿!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
}
相关推荐
Highcharts.js17 小时前
Highcharts 集成到 React 或 Vue 项目中时,如何高效地使用 TypeScript技巧?
vue.js·人工智能·react.js·typescript·前端框架·highcharts
liuchangng2 天前
React 19 + Vite 6 实战:从教材 PDF 到 866 词间隔重复单词 App
前端·react.js·pdf·vite·开源项目
鸿蒙开发2 天前
Three.js 首帧卡顿排查:compileAsync 之后,为什么还会停一下?
react.js·three.js
小李科技3 天前
【性能优化】事件委托:目标定位与 React/Vue 实战
前端·vue.js·react.js·面试·性能优化·前端框架
csj503 天前
前端基础之《React(16)—Modal组件封装》
前端·react.js
ZoeLandia5 天前
React11:数据请求与 TanStack Query
前端·react.js·typescript·react
瓦瓦gogo5 天前
实习中接触前端开发后,我开始了解 React
前端·react.js·前端框架
ZoeLandia6 天前
React08:自定义 Hook
开发语言·前端·react.js·typescript
空中湖7 天前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
来一首_We_go9 天前
React Flow Pro 高级交互实现
前端·react.js