新闻详情

新闻详情

首页 / 资讯中心 / 详情

Storybook Addon 开发:使用 `setQueryParams` 删除 URL 查询参数

发布时间:2026/9/10 14:19:06来源:尧图网络
Storybook Addon 开发:使用 `setQueryParams` 删除 URL 查询参数
Storybook Addon 开发使用setQueryParams删除 URL 查询参数【免费下载链接】storybookStorybook is the industry standard workshop for building, documenting, and testing UI components in isolation项目地址: https://gitcode.com/GitHub_Trending/st/storybook导读本文聚焦 Storybook Addon API 中 URL 查询参数的生命周期管理当你的自定义 Addon 通过setQueryParams把临时状态写入浏览器地址栏后如何在需要时把它“擦除”。删除查询参数的正确姿势并不是从对象中剔除键而是将该键的值显式设为null。本文将以 Storybook Addons API 文档 为依据结合storybook/manager-api的真实实现源码讲清楚“传null即删除”背后的机制并给出可直接落地的示例代码。为什么需要清除查询参数查询参数是 Addon 的“临时存储”在 docs/addons/addons-api.mdx 的api.setQueryParams()一节中Storybook 官方给出明确定位This method allows you to set query string parameters. You can use that as temporary storage for addons.即setQueryParams允许 Addon 把需要跨刷新、跨 story 切换保留的轻量状态如面板开关、过滤词、上次选中的视图写进浏览器 URL 的查询字符串中充当一种无后端、可分享、可刷新恢复的临时存储。这也是 Addon 开发者接入 manager 端 UI 状态时最常用的方式之一。调用addons.register()注册 Addon 时回调函数会拿到 Storybook API 实例所有 URL 相关操作都基于这个实例完成import { addons } from storybook/manager-api; addons.register(my-organisation/my-addon, (api) { // api.setQueryParams / api.getQueryParam / api.getUrlState ... });写入把状态塞进 URL在清除之前先看如何写入。使用setQueryParams传入一个键值对象即可addons.register(my-organisation/my-addon, (api) { api.setQueryParams({ exampleParameter: Sets the example parameter value, anotherParameter: Sets the another parameter value, }); });调用后Storybook 会把这些键值同步到 manager 的地址栏查询字符串中例如 URL 中会出现?...exampleParameter...并且不会覆盖已经存在于地址栏中的其他参数如args、globals。从源码类型定义看setQueryParams接受的是这样一个宽松的对象类型位于 code/core/src/manager-api/modules/url.tsinterface QueryParamInput { [key: string]: string | undefined | null; }注意这里值只允许string | undefined | null意味着查询参数的值只能是字符串——如果你要保存布尔值或对象需要自行做序列化例如JSON.stringify或String(bool)。清除本文核心把值设为null而不是删除键当某个参数不再需要时文档在setQueryParams一节的末尾给出了明确的指导docs/addons/addons-api.mdxAdditionally, if you need to remove a query parameter, set it asnullinstead of removing them from the addon.对应的代码片段即 docs/_snippets/storybook-addons-api-disablequeryparams.mdaddons.register(my-organisation/my-addon, (api) { api.setQueryParams({ exampleParameter: null, }); });这段代码执行后exampleParameter会从 URL 中彻底消失。几个关键点不要在传入的临时对象上把键“去掉”后调用setQueryParams因为setQueryParams的语义是合并merge更新只处理你传入的键其它已存在的自定义参数保持不变。想删除某个参数就必须显式地把它的值传成null传null之后该键会从内部状态中被delete同时地址栏中对应的keyvalue片段也会被清除若 Addon 里通过getQueryParam再次读取该键会得到undefined而不是残留的旧值。源码级原理null/undefined触发删除setQueryParams的底层实现位于 code/core/src/manager-api/modules/url.ts核心逻辑相当直白setQueryParams(input) { const { customQueryParams } store.getState(); const update: QueryParams { ...customQueryParams }; for (const [key, value] of Object.entries(input)) { if (value null || value undefined) { delete update[key]; } else { update[key] value; } } if (!deepEqual(customQueryParams, update)) { store.setState({ customQueryParams: update }); provider.channel?.emit(UPDATE_QUERY_PARAMS, update); } },逐行解读这段实现可以验证文档描述的准确性基于当前快照合并先从 manager store 中读取已有的customQueryParams并浅拷贝出update因此未在input中出现的旧参数不会被触碰值判空即删除遍历传入对象的每个键一旦发现值为null或undefined就从update中用delete删除该键否则写入新值——这正是“设null等于删除”的直接依据变更保护通过deepEqual比较新旧状态仅当确实发生变化时才触发store.setState与provider.channel?.emit(UPDATE_QUERY_PARAMS, update)。也就是说对一个已经不存在的键反复传null是幂等的不会产生多余的 store 更新和事件广播。与之配套的getQueryParam(key)同样读取这份customQueryParams状态见 code/core/src/manager-api/modules/url.tsgetQueryParam(key) { const { customQueryParams } store.getState(); return customQueryParams ? customQueryParams[key] : undefined; }getUrlState()则一次性返回path、hash、queryParams、storyId、viewMode、url等完整地址栏状态见 code/core/src/manager-api/modules/url.ts适合需要同时读取多个参数或在导航前后做判断的场景addons.register(my-organisation/my-addon, (api) { const href api.getUrlState({ selectedKind: kind, selectedStory: story, }).url; });值得补充的是Storybook 自身也是通过setQueryParams维护args、globals等参数到地址栏的同步的。例如在 url.ts 的 updateArgsParam 中当 story 切换或 args 更新时会执行api.setQueryParams({ args: argsString || null })——参数不再需要时同样使用null占位来清除。这说明“置空即清除”是 Storybook 内部统一遵循的约定Addon 开发者照此办理即可与内置机制保持一致。读取与验证清除后如何确认清除完成后验证手段有两种直接读取调用api.getQueryParam(exampleParameter)返回值应为undefinedaddons.register(my-organisation/my-addon, (api) { api.getQueryParam(exampleParameter); // undefined说明参数已被移除 });观察地址栏浏览器地址栏中对应keyvalue片段会同步消失。由于参数是被写入 URL 的用户手动刷新页面、或通过分享链接把 URL 发给他人后被清除的参数不会再次“复活”。实战组合状态写入与清除的完整闭环以一个“面板开关”型 Addon 为例把以上 API 串联起来注册面板组件时写入参数、面板激活状态变化时清除参数从而保证 Addon 状态可被 URL 记住、也可被 URL 忘记。import { addons } from storybook/manager-api; addons.register(my-organisation/my-addon, (api) { // 用户开启某个视图时写入标记 const enableHighlight () { api.setQueryParams({ highlight: on }); }; // 用户关闭视图时清除标记传 null而非删键 const disableHighlight () { api.setQueryParams({ highlight: null }); }; // 初始化时恢复读取不到即 undefined const current api.getQueryParam(highlight); // on | undefined // 供你自己的 UI 组件调用或绑定到 button 的 onClick api.addNotification({ id: highlight, content: { headline: Highlight Addon } }); });在此基础上Addon 的面板内部还可以通过useStorybookApiHook 拿到同样的api实例做状态联动参见 imports 示例import { useStorybookApi } from storybook/manager-api; function HighlightPanel() { const api useStorybookApi(); const enabled api.getQueryParam(highlight) ! undefined; return ( button onClick{() api.setQueryParams({ highlight: enabled ? null : on })} {enabled ? Disable highlight : Enable highlight} /button ); }常见误区与注意事项用“删键”代替“置空”不会生效由于setQueryParams按传入键做增量合并键不在输入对象中就意味着“本次不改动”因此删除必须显式传null值类型限制QueryParamInput只接受字符串值null/undefined专用于删除。对象、数字、布尔值等需先序列化为字符串再写入只影响 manager 端 URLsetQueryParams操作的是 Storybook manager 界面addon 面板所在环境的 URL 状态若 Addon 需要往预览 iframe 传递数据应走 channel 或预览参数等其它机制幂等安全setQueryParams内置deepEqual变更检测见 url.ts重复清除不存在的键不会产生额外 store 更新可在事件回调中放心反复调用刷新与分享语义写入的查询参数会真实反映在地址栏因此请勿把敏感或超长数据如完整日志塞入 URL它本质上是可公开浏览的“临时存储”。小结本文系统梳理了 Storybook Addon 通过 URL 查询参数管理临时状态的完整链路。核心结论可以归纳为一条规则需要删除参数时用setQueryParams({ key: null })而不是把键从对象中剔除。这一约定不仅记录在 Addons API 文档 的setQueryParams章节中也由 url.ts 的合并逻辑value null || value undefined时执行delete update[key]提供了源码级的确认。配合getQueryParam读取与getUrlState快照开发者可以轻松实现 Addon 状态“可写入、可读取、可清除”的完整闭环。【免费下载链接】storybookStorybook is the industry standard workshop for building, documenting, and testing UI components in isolation项目地址: https://gitcode.com/GitHub_Trending/st/storybook创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

混合型谐波抑制系统设计与Simulink仿真实践 2026/9/10 14:58:13

混合型谐波抑制系统设计与Simulink仿真实践

1. 项目背景与核心需求在电力电子系统设计中,谐波抑制一直是工程师们面临的棘手问题。我最近完成了一个混合型谐波抑制系统的仿真项目,结合了无源电力滤波器(PPF)和有源电力滤波器(APF)的优势,在…

阅读更多 →
古典密码学入门:从凯撒密码到维吉尼亚加密 2026/9/10 14:58:13

古典密码学入门:从凯撒密码到维吉尼亚加密

1. 古典密码概述密码学就像人类文明的一面镜子,从古埃及的象形文字到二战时期的恩尼格玛机,每个时代的加密方式都折射出当时的技术水平和思维方式。今天我们就来聊聊密码学的"老祖宗"们——那些在计算机诞生前就存在的古典密码。1.1 什么是古典…

阅读更多 →
驾驶证公证认证多少钱?材料清单、零跑腿办理攻略(出国自驾必备) 2026/9/10 14:58:13

驾驶证公证认证多少钱?材料清单、零跑腿办理攻略(出国自驾必备)

出国自驾想要合法租车开车,驾驶证公证认证是很多人都会碰到的业务。整体费用会根据翻译语种、认证等产生浮动,单纯驾驶证公证费用大致在百元区间。很多计划出境自驾的朋友,对驾驶证公证认证一知半解,不清楚要准备哪些材料&#xf…

阅读更多 →
数学可视化实用指南:awesome-math 资源地图 2026/9/10 14:58:13

数学可视化实用指南:awesome-math 资源地图

数学可视化实用指南:awesome-math 资源地图 【免费下载链接】awesome-math A curated list of awesome mathematics resources 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-math 公式越推越晕,图形看了一堆却抓不住重点&#xff1…

阅读更多 →
Escrcpy:高效安卓投屏与AI自动化工具详解 2026/9/10 14:58:13

Escrcpy:高效安卓投屏与AI自动化工具详解

1. Escrcpy:安卓投屏工具的终极解决方案第一次接触Escrcpy是在调试一个需要手机屏幕实时反馈的自动化测试项目。当时市面上主流工具要么收费昂贵,要么延迟高得让人抓狂,直到发现这个基于scrcpy二次开发的神器。它不仅保留了原版低延迟、高画质…

阅读更多 →
Elasticsearch核心概念与生产环境部署指南 2026/9/10 14:55:13

Elasticsearch核心概念与生产环境部署指南

1. Elasticsearch核心概念全景解析 Elasticsearch作为当前最流行的分布式搜索和分析引擎,其核心架构设计与传统数据库有着本质区别。我在实际项目中使用ES近五年,发现许多开发者最初接触时容易被其术语体系迷惑。这里我将用最直白的语言拆解这些概念。 …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞