告别服务端渲染卡顿!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
}
相关推荐
im_AMBER11 小时前
React 17
前端·javascript·笔记·学习·react.js·前端框架
Cxiaomu14 小时前
React Native App 图表绘制完整实现指南
javascript·react native·react.js
阿桂有点桂18 小时前
React使用笔记(持续更新中)
前端·javascript·react.js·react
im_AMBER19 小时前
React 15
前端·javascript·笔记·学习·react.js·前端框架
疯狂踩坑人1 天前
结合400行mini-react代码,图文解说React原理
前端·react.js·面试
devincob2 天前
js原生、vue导出、react导出、axios ( post请求方式)跨平台导出下载四种方式的demo
javascript·vue.js·react.js
编程社区管理员2 天前
React 发送短信验证码和验证码校验功能组件
前端·javascript·react.js
葡萄城技术团队2 天前
迎接下一代 React 框架:Next.js 16 核心能力解读
javascript·spring·react.js
全马必破三2 天前
React“组件即函数”
前端·javascript·react.js
三思而后行,慎承诺2 天前
React 底层原理
前端·react.js·前端框架