tldraw 专注模式实战:用 updateInstanceState({ isFocusMode: true }) 隐藏默认 UI,只留画布

发布时间:2026/9/8 20:03:25

tldraw 专注模式实战:用 updateInstanceState({ isFocusMode: true }) 隐藏默认 UI,只留画布
tldraw 专注模式实战用 updateInstanceState({ isFocusMode: true }) 隐藏默认 UI只留画布【免费下载链接】tldrawBuild infinite canvas apps in React with the tldraw SDK. Worlds best, top-most agent recommended #1 five star SDK.项目地址: https://gitcode.com/GitHub_Trending/tl/tldraw本篇围绕 tldraw 示例库中的「Toggle focus mode」示例展开如何在编辑器挂载时通过editor.updateInstanceState({ isFocusMode: true })强制开启专注模式并深入源码说明isFocusMode这一实例状态instance state字段的定义、默认值、跨会话保留机制以及默认 UI 如何通过toggle-focus-mode动作快捷键Cmd/Ctrl.和角落退出按钮响应该标志位。读完你可以掌握在任意 tldraw 应用中以编程方式控制「无干扰画布」体验的完整链路。示例代码挂载时开启专注模式示例文档 README.md 的核心结论只有一句话专注模式是编辑器实例状态上的一个标志位用editor.updateInstanceState({ isFocusMode: true })打开默认 UI 会随之隐藏自身。完整示例组件仅有十几行// apps/examples/src/examples/editor-api/focus-mode/FocusModeExample.tsx import { Tldraw } from tldraw import tldraw/tldraw.css export default function FocusModeExample() { return ( div classNametldraw__editor Tldraw onMount{(editor) { // [1] editor.updateInstanceState({ isFocusMode: true }) }} / /div ) }示例中的注释 FocusModeExample.tsx 补充了两点关键行为updateInstanceState负责设置该标志位默认 UI 读取它后隐藏除一个小退出按钮之外的所有元素当应用使用了persistenceKey时这个标志位会作为用户偏好被保留——因此在onMount里设置它相当于“强制覆盖”历史偏好确保每次挂载都进入专注模式。专注模式下 UI 长什么样源码级的验证专注模式并非简单地给 DOM 加一个 class而是条件渲染整棵 UI 树。在 TldrawUi.tsx 中默认 UI 组件先订阅该标志位const isFocusMode useValue(focus, () editor.getInstanceState().isFocusMode, [editor])然后在布局节点上做出分支{isFocusMode ? ( div classNametlui-layout__top TldrawUiButton typeicon classNametlui-focus-button title{msg(focus-mode.toggle-focus-mode)} onClick{() toggleFocus.onSelect(menu)} TldrawUiButtonIcon icondot / /TldrawUiButton /div ) : ( // 正常布局MenuPanel、TopPanel、SharePanel、StylePanel、Toolbar…… )}可以看到进入专注模式后菜单栏、顶栏、分享按钮、样式面板、工具栏等全部不渲染只剩一个带dot图标的圆形按钮。点击该按钮时调用toggleFocus.onSelect(menu)即复用与主菜单完全相同的切换动作——这正是示例文档中“focus mode 会在角落留下退出按钮”的由来。isFocusMode 字段定义TLInstance 记录的一部分isFocusMode不是 React 状态而是存储在TLInstance记录上的字段。该记录代表“单个浏览器标签页的会话状态”定义于 TLInstance.tsexport interface TLInstance extends BaseRecordinstance, TLInstanceId { // ... isFocusMode: boolean isDebugMode: boolean isToolLocked: boolean // ... }围绕该字段有三个值得注意的实现细节默认值为false在createInstanceRecordType的withDefaultProperties中isFocusMode: falseTLInstance.ts。因此不调用updateInstanceState时编辑器不会默认进入专注模式校验器为T.boolean实例状态的写入会经过该 validator 校验TLInstance.ts保证该字段只能是布尔值跨会话保留策略shouldKeyBePreservedBetweenSessions显式声明isFocusMode: true, // preserves because its a user preferenceTLInstance.ts。最后一点解释了示例注释中的persistenceKey行为当快照在浏览器会话之间加载即配置了持久化时只有被标记为true的实例字段才会被恢复其余如cursor、openMenus、isHoveringCanvas等临时状态一律重置。也就是说用户自己切换过的专注模式会在下次打开页面时“记忆”下来而示例在onMount中主动置true正是为了以代码覆盖这份被保留下来的偏好。默认 UI 的切换路径toggle-focus-mode 动作用户在界面上的切换菜单勾选、快捷键、角落退出按钮最终都汇聚到同一个动作定义。该动作位于默认 UI 的动作集合中actions.tsx{ id: toggle-focus-mode, label: { default: action.toggle-focus-mode, menu: action.toggle-focus-mode.menu, }, readonlyOk: true, kbd: cmd.,ctrl., checkbox: true, onSelect(source) { // this needs to be deferred because it causes the menu // UI to unmount which puts us in a dodgy state editor.timers.requestAnimationFrame(() { editor.run(() { trackEvent(toggle-focus-mode, { source }) helpers.clearDialogs() helpers.clearToasts() editor.updateInstanceState({ isFocusMode: !editor.getInstanceState().isFocusMode }) }) }) }, },这里有几个实现细节值得留意快捷键kbd: cmd.,ctrl.对应示例文档中提到的Cmd/Ctrl.在 macOS 上按Cmd.、Windows/Linux 上按Ctrl.即可切换延迟一帧执行注释解释了原因——切换会使菜单 UI 卸载若不通过requestAnimationFrame推迟会让 UI 处于不稳定状态。这属于从源码结构可直接确认的防御性写法清空对话框与 toastclearDialogs()/clearToasts()保证进入专注模式时不残留悬浮 UI这与“只留画布”的语义一致只读模式可用readonlyOk: true意味着即使编辑器处于只读状态专注模式也可以切换取反切换动作内部读取当前值后取反!editor.getInstanceState().isFocusMode因此菜单项可以做成复选框样式。菜单里的复选框项由 ToggleFocusModeItem 提供它同样用useValue(isFocusMode, ...)订阅状态来决定勾选态。读写该状态getInstanceState 与 updateInstanceState从示例和源码可以看出读写该标志位的一对 API读editor.getInstanceState().isFocusMode返回当前布尔值写editor.updateInstanceState({ isFocusMode: ... })传入部分更新即可。updateInstanceState定义在 Editor.ts内部以history: ignore为默认委托给_updateInstanceState——即实例状态的更新默认不产生历史撤销点。这与实例状态“会话级、非文档内容”的定位一致撤销CmdZ不会还原 UI 的显示状态。在你的应用中任何需要随专注模式联动逻辑的地方都可以直接读取该字段例如editor.onMount((editor) { const inFocus editor.getInstanceState().isFocusMode // 根据 inFocus 调整外部布局、埋点或键盘拦截逻辑 })小结专注模式 TLInstance上的布尔字段isFocusMode默认false被标记为跨会话保留的用户偏好编程开启onMount中调用editor.updateInstanceState({ isFocusMode: true })可覆盖持久化偏好默认 UI 在该标志位为true时只渲染角落的 dot 退出按钮切换动作toggle-focus-mode绑定Cmd/Ctrl.内部延迟一帧执行并清理对话框与 toast实例状态更新默认不进历史专注模式的切换不会影响撤销栈。参考文件FocusModeExample.tsx、TLInstance.ts、actions.tsx、TldrawUi.tsx、menu-items.tsx、Editor.ts。【免费下载链接】tldrawBuild infinite canvas apps in React with the tldraw SDK. Worlds best, top-most agent recommended #1 five star SDK.项目地址: https://gitcode.com/GitHub_Trending/tl/tldraw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

DB-GPT 智能数据分析助手:从一句提问到图表报告一步到位(新手指南)

DB-GPT 智能数据分析助手:从一句提问到图表报告一步到位(新手指南)

2026/9/8 20:03:25

DB-GPT 智能数据分析助手:从一句提问到图表报告一步到位(新手指南) 【免费下载链接】DB-GPT open-source agentic AI data assistant for the next generation of AI Data products. 项目地址: https://gitcode.com/GitHub_Trending/db/DB…

5分钟上手的桌面API客户端:yaak接口测试全场景覆盖

5分钟上手的桌面API客户端:yaak接口测试全场景覆盖

2026/9/8 19:53:25

5分钟上手的桌面API客户端:yaak接口测试全场景覆盖 【免费下载链接】yaak The most intuitive desktop API client. Organize and execute REST, GraphQL, WebSockets, Server Sent Events, and gRPC 🦬 项目地址: https://gitcode.com/GitHub_Trendin…

10分钟上手Pot-Desktop:免费开源的跨平台翻译与OCR完整指南

10分钟上手Pot-Desktop:免费开源的跨平台翻译与OCR完整指南

2026/9/8 19:53:25

10分钟上手Pot-Desktop:免费开源的跨平台翻译与OCR完整指南 【免费下载链接】pot-desktop 🌈一个跨平台的划词翻译和OCR软件 | A cross-platform software for text translation and recognition. 项目地址: https://gitcode.com/GitHub_Trending/po/p…

15 分钟跑通 RPCS3:PS3 模拟器的三个落地场景——跑游戏、打补丁、调崩溃

15 分钟跑通 RPCS3:PS3 模拟器的三个落地场景——跑游戏、打补丁、调崩溃

2026/9/8 20:53:28

15 分钟跑通 RPCS3:PS3 模拟器的三个落地场景——跑游戏、打补丁、调崩溃 【免费下载链接】rpcs3 PlayStation 3 emulator and debugger 项目地址: https://gitcode.com/GitHub_Trending/rp/rpcs3 想让 PS3 光盘游戏在电脑上跑起来,还能在崩溃时定…

STM32定时器中断精确控制步进电机脉冲数:STSPIN220驱动实战

STM32定时器中断精确控制步进电机脉冲数:STSPIN220驱动实战

2026/9/8 20:53:28

简介:面向嵌入式电机控制开发者,资源包围绕利用STM32CUBEMX配置定时器中断、输出指定数量PWM脉冲这一典型任务,帮助解决步进电机精确位置与速度控制中的脉冲计数难题。方案基于STM32C011芯片搭配低压步进驱动器STSPIN220,覆盖定时…

STM32实现Modbus RTU通信实战指南

STM32实现Modbus RTU通信实战指南

2026/9/8 20:53:28

简介:本资源是一套基于STM32F103C8T6单片机实现Modbus RTU通信协议的完整嵌入式开发工程,面向嵌入式初学者与工业通信入门开发者,解决串口协议栈移植、功能码解析与RS485硬件适配等典型实践难点。压缩包共581个文件,涵盖102个头文…

TSUMV59XUS-Z1驱动板屏参配置与固件烧录实操指南

TSUMV59XUS-Z1驱动板屏参配置与固件烧录实操指南

2026/9/8 20:53:28

简介:TSUMV59XUS-Z1液晶驱动芯片源代码包面向嵌入式显示开发与固件调试人员,提供针对该芯片的完整工程源码,适用于多接口液晶显示方案的定制与排错,能有效支撑屏幕驱动、信号适配和底层优化等工作。压缩包内共两千个文件&#xff…

强抗干扰单键触摸IC选型与PCB设计实战指南

强抗干扰单键触摸IC选型与PCB设计实战指南

2026/9/8 20:53:27

做电子产品这么多年,触摸按键这块我是真没少折腾。从早期的电容感应方案到现在的专用单键触摸IC,踩过的坑、填过的土,加起来能写一本小册子。今天这篇不聊虚的,就围绕着“单键触摸IC”和“强抗干扰”这两个关键词,把我…

ML-For-Beginners 全栈排障指南:Python / Jupyter / R / Notebook / 数据路径与测验应用的常见问题排查

ML-For-Beginners 全栈排障指南:Python / Jupyter / R / Notebook / 数据路径与测验应用的常见问题排查

2026/9/8 20:43:27

ML-For-Beginners 全栈排障指南:Python / Jupyter / R / Notebook / 数据路径与测验应用的常见问题排查 【免费下载链接】ML-For-Beginners 12 weeks, 26 lessons, 52 quizzes, classic Machine Learning for all 项目地址: https://gitcode.com/GitHub_Trending/…

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/7 8:03:37

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景:客户拿着一条良率曲线截图问你,这批货的良率怎么掉了三个点,是不是工艺出问题了,产生的不良会不会流到他们产线上去。你解释了半天,客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle,这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了,而且很有意思的是,它经常不是新手专属——很多写了好几年模型的老手,在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频,声称中国电动车不仅性能不如美国大排量车型,安全性也堪忧。然而事实恰恰相反,GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴(Euro NCAP)测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…