告别服务端渲染卡顿!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
}
相关推荐
鹤鸣的日常10 小时前
前端运行时动态环境变量方案
前端·react.js·docker·前端框架·vue·gitlab
vim怎么退出18 小时前
Dive into React——事件系统
前端·react.js·源码阅读
打小就很皮...20 小时前
基于 Python + LangChain + React 实现智能发票识别与验真系统实战
前端·react.js·langchain·ocr·发票识别
圣殿骑士-Khtangc1 天前
单智能体落地实战:从 ReAct 到 Production-Ready AI Agent 全链路解析
人工智能·react.js
Patrick_Wilson1 天前
router.replace 之后紧跟 reload,页面为什么无限刷新?
javascript·react.js·浏览器
xiaofeichaichai1 天前
React Hooks
前端·javascript·react.js
markfeng82 天前
Redux 与 React-Redux 深度解析:从原理到最佳实践
react.js
微扬嘴角2 天前
react篇4--setState、LazyLoad和Hooks
前端·javascript·react.js
光影少年2 天前
React 项目常见优化方案
前端·react.js·前端框架
光影少年2 天前
组件复用:HOC、Render Props、自定义Hook 对比
前端·react.js·掘金·金石计划