告别服务端渲染卡顿!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
}
相关推荐
西洼工作室6 小时前
React轮播图优化:通过延迟 + 动画的组合,彻底消除视觉上的闪烁感
前端·react.js·前端框架
晓13138 小时前
React篇——第三章 状态管理之 Redux 篇
前端·javascript·react.js
@大迁世界8 小时前
11.在 React.js 中,state 与 props 的差异体现在哪里?
前端·javascript·react.js·前端框架·ecmascript
@大迁世界11 小时前
13.在 React 中应怎样正确更新 state?
前端·javascript·react.js·前端框架·ecmascript
Jinuss11 小时前
源码分析之React中useRef解析
前端·javascript·react.js
badhope12 小时前
前端已死?前端角色演进的四维技术证据链(2026年实证)
react.js·django·node.js
qq_4061761412 小时前
React 组件传参 & 路由跳转传参
前端·javascript·react.js
Csvn12 小时前
React 测试入门:Jest + Testing Library 完整指南
前端·react.js
cch891813 小时前
React Hooks的支持
前端·javascript·react.js
ofoxcoding13 小时前
React 性能优化实战:我把一个卡成 PPT 的页面优化到丝滑的全过程
javascript·react.js·ai·性能优化