告别服务端渲染卡顿!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
}
相关推荐
燃烧的土豆11 小时前
100¥ 实现的React项目 Keep-Alive 缓存控件
前端·react.js·ai编程
爱吃无爪鱼13 小时前
03-Bun vs Node.js:JavaScript 运行时的新旧之争
javascript·vue.js·react.js·npm·node.js
一颗烂土豆14 小时前
React 大屏可视化适配方案:vfit-react 发布 🚀
前端·javascript·react.js
Li_na_na0114 小时前
React+dhtmlx实现甘特图
前端·react.js·甘特图
csdn小瓯14 小时前
一个现代化的博客应用【react+ts】
前端·react.js·前端框架
一颗不甘坠落的流星14 小时前
【@ebay/nice-modal-react】管理React弹窗(Modal)状态
前端·javascript·react.js
黛色正浓14 小时前
【React】极客园案例实践-Layout模块
前端·react.js·前端框架
黛色正浓15 小时前
【React】极客园案例实践-项目搭建和登录模块
前端·react.js·rust
Youyzq16 小时前
react 元素触底hooks封装
前端·javascript·react.js
爱吃无爪鱼16 小时前
04-npm 与 Bun 快速入门实战指南
前端·vue.js·react.js·npm·sass