Skip to content

fix(useWebSocket): replace ref+useMemo pattern with useState+useEffect in demo#2917

Draft
Copilot wants to merge 2 commits intomasterfrom
copilot/fix-ui-rendering-with-ref
Draft

fix(useWebSocket): replace ref+useMemo pattern with useState+useEffect in demo#2917
Copilot wants to merge 2 commits intomasterfrom
copilot/fix-ui-rendering-with-ref

Conversation

Copy link
Copy Markdown

Copilot AI commented Mar 28, 2026

The useWebSocket demo tracked message history via useRef + useMemo, mutating ref.current during render. This pattern is confusing and non-idiomatic — it only worked incidentally because latestMessage state changes triggered re-renders.

[English Template / 英文模板]

🤔 这个变动的性质是?

  • 新特性提交
  • 日常 bug 修复
  • 站点、文档改进
  • 演示代码改进
  • TypeScript 定义更新
  • 包体积优化
  • 性能优化
  • 功能增强
  • 国际化改进
  • 重构
  • 代码风格优化
  • 测试用例
  • 分支合并
  • 其他改动(是关于什么的改动?)

🔗 相关 Issue

用户在 issue 中指出 demo 里 ref.current = useMemo(...) 的写法不是常规模式,并询问其合理性。

💡 需求背景和解决方案

旧写法(非惯用模式):

const messageHistory = useRef<any[]>([]);
messageHistory.current = useMemo(
  () => messageHistory.current.concat(latestMessage),
  [latestMessage],
);

在渲染期间直接对 ref.current 赋值属于副作用,且 ref 变化本身不触发重渲染——此处能正常工作只是因为 latestMessage 状态变化恰好触发了重渲染,属于隐式依赖,容易误导开发者。

新写法(惯用模式):

const [messageHistory, setMessageHistory] = useState<WebSocketEventMap['message'][]>([]);

useEffect(() => {
  if (latestMessage !== undefined) {
    setMessageHistory((prev) => [...prev, latestMessage]);
  }
}, [latestMessage]);

使用 useState 管理需要渲染的数据,使用 useEffect 响应 latestMessage 变化,符合 React 标准模式。

📝 更新日志

语言 更新描述
🇺🇸 英文 useWebSocket demo: replaced non-idiomatic useRef + useMemo message history pattern with standard useState + useEffect
🇨🇳 中文 useWebSocket 演示代码:将非惯用的 useRef + useMemo 消息历史写法替换为标准的 useState + useEffect 写法

☑️ 请求合并前的自查清单

⚠️ 请自检并全部勾选全部选项⚠️

  • 文档已补充或无须补充
  • 代码演示已提供或无须提供
  • TypeScript 定义已补充或无须补充
  • Changelog 已提供或无须提供

🔒 GitHub Advanced Security automatically protects Copilot coding agent pull requests. You can protect all pull requests by enabling Advanced Security for your repositories. Learn more about Advanced Security.

@CLAassistant
Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

…ffect in useWebSocket demo

Agent-Logs-Url: https://github.com/alibaba/hooks/sessions/1a77d062-ee53-4401-83fa-2872626cf1b1

Co-authored-by: crazylxr <16161407+crazylxr@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix UI rendering issue with useWebsocket and ref usage fix(useWebSocket): replace ref+useMemo pattern with useState+useEffect in demo Mar 28, 2026
Copilot AI requested a review from crazylxr March 28, 2026 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

useWebsocket的案例里面,UI渲染是通过ref来渲染的,这种是常规模式么?

3 participants