尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

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

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),仅供参考
返回列表