Metabase Embedding SDKDrillThroughQuestionProps完全指南:交互式问题下钻的 Props 配置与实战
【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase
DrillThroughQuestionProps是 Metabase Embedding SDK 中用于配置「下钻问题」(drill-through question)的公开 Props 类型,与InteractiveQuestion组件配套使用。本文以 docs/embedding/sdk/api/snippets/DrillThroughQuestionProps.md 为骨架,逐项拆解全部 20 个属性的类型、默认行为与适用场景,并结合仓库源码(InteractiveQuestion组件与其运行时 Schema 校验)解释这些 Props 的实际流向,帮助你准确控制下钻问题的数据源选择、保存流程、回调时机与界面元素开关。
一、DrillThroughQuestionProps是什么
DrillThroughQuestionProps是 SDK 文档体系中InteractiveQuestion类别下的一个公开类型,官方文档的定位只有一句话:“Props for the drill-through question”(下钻问题的 Props)。在 SDK 的 API 索引 docs/embedding/sdk/api/snippets/index.md 中,它与InteractiveQuestionProps、InteractiveQuestionComponents等类型并列,属于交互式问题(Interactive Question)能力家族。
所谓“下钻问题”,指的是用户在交互式问题/仪表盘中点击数据点后,跳转进入的、用于探索该数据点背后明细的问题视图。从源码看,InteractiveQuestion组件(InteractiveQuestion.tsx)本质上是对SdkQuestion的封装:它解构出query、card、questionId、token、title、withDownloads、isSaveEnabled、withAlerts等属性后,将剩余 Props 透传给内部的SdkQuestion。因此DrillThroughQuestionProps中的大部分属性(保存、下载、标题、尺寸、样式等)最终都会作用于同一个问题渲染管线。
该类型全部属性均为可选(以?标记),这意味着你可以按需增量配置:不传任何 Props 也能渲染一个功能完整的下钻问题,传入的每个属性只负责打开或调整某一项能力。
二、完整属性速查表
下表完整继承自 DrillThroughQuestionProps.md,涵盖全部 20 个属性:
| 属性 | 类型 | 说明 |
|---|---|---|
children? | ReactNode | 组件的子节点内容 |
className? | string | 添加到根元素的自定义类名 |
dataPicker? | EmbeddingDataPicker | 控制问题中数据源选择菜单;设置dataPicker = "staged"可启用完整数据选择器 |
entityTypes? | EmbeddingEntityType[] | 指定数据选择器中可用实体类型的数组 |
height? | Height<string \| number> | 数字或字符串形式的 CSS 尺寸值,指定组件高度 |
initialCollection? | SdkCollectionId | 保存弹窗的集合选择器中预选中的集合。与targetCollection不同,选择器仍然可见,用户可改选其他集合;当targetCollection设置时该属性被忽略 |
initialSqlParameters? | SqlParameterValues | SQL 参数的初始值,以 slug 为键。仅在挂载时应用一次,之后用户在控件中的编辑不会回传给宿主 |
isSaveEnabled? | boolean | 是否显示保存按钮 |
onBeforeSave? | (question: [MetabaseQuestion](https://link.gitcode.com/i/7addd41cc11ae29cb0040a58e8936b60) \|undefined, context:{ isNewQuestion: boolean }) =>Promise| 保存前触发的回调,仅在isSaveEnabled = true` 时相关 | |
onRun? | (question: [MetabaseQuestion](https://link.gitcode.com/i/7addd41cc11ae29cb0040a58e8936b60) \|undefined) =>void| 问题更新时触发的回调,包括用户点击问题编辑器中的Visualize` 按钮 | |
onSave? | (question: [MetabaseQuestion](https://link.gitcode.com/i/7addd41cc11ae29cb0040a58e8936b60), context:{ dashboardTabId?: number; isNewQuestion: boolean }) =>void| 用户保存问题时触发的回调,仅在isSaveEnabled = true` 时相关 | |
plugins? | MetabasePluginsConfig | 插件配置(官方文档未展开说明) |
style? | CSSProperties | 添加到根元素的自定义样式对象 |
targetCollection? | SdkCollectionId | 问题要保存到的集合;设置后会隐藏保存弹窗中的集合选择器。仅适用于交互式问题 |
title? | SdkQuestionTitleProps | 决定问题标题是否显示,并允许用自定义标题替代默认问题标题。默认显示 |
width? | Width<string \| number> | 数字或字符串形式的 CSS 尺寸值,指定组件宽度 |
withAlerts? | boolean | 是否允许在问题上设置告警(alerts) |
withChartTypeSelector? | boolean | 是否显示图表类型选择器及对应的设置按钮,仅在使用默认布局时相关 |
withDownloads? | boolean | 是否允许在问题中下载结果 |
withEditorButton? | boolean | 是否显示编辑器按钮,仅在使用默认布局时相关 |
三、布局与外观:children/className/style/width/height/title
这类属性控制下钻问题的“外壳”表现:
children:标准 React 子节点,可用来在组件内部嵌入自定义内容;className与style:分别以类名和样式对象两种方式作用于根元素,适合与宿主应用的 CSS 体系对接;width与height:接受数字或 CSS 字符串(如"100%"、600),用于固定组件尺寸,在嵌入布局中避免因内容变化导致容器抖动;title:类型为SdkQuestionTitleProps,控制标题是否展示(默认展示),并可传入自定义标题文本替代默认的问题标题。
四、数据源选择:dataPicker/entityTypes
下钻问题同样需要用户选择数据源(例如通过 SQL 新建问题时选择表或模型),这两个属性共同定制数据选择器:
dataPicker:类型为EmbeddingDataPicker。文档明确指出,将其设置为"staged"可获得完整的(full)数据选择器体验;不设置时则使用受限的默认行为。这一设计让宿主应用可以在“轻量选择”与“完整浏览”两种模式间取舍。entityTypes:一个EmbeddingEntityType数组,声明数据选择器中允许出现的实体类型(如表、模型、问题、指标等),用于收窄用户可选范围、减少误操作。
两个属性配合使用,即可控制下钻问题的“取数入口”到底开放到什么程度。
五、集合定位:initialCollection与targetCollection
二者都与“集合(Collection)”相关,但语义截然不同,是容易混淆的一对:
initialCollection:预选保存弹窗集合选择器中的某个集合,但选择器仍然可见,用户可以改选其他集合。它只影响初始状态,不强制最终去向。targetCollection:直接指定问题保存到的集合,并隐藏集合选择器。文档特别注明“仅适用于交互式问题”,并且当targetCollection被设置时,initialCollection会被忽略。
典型用法是:嵌入应用中默认将用户下钻得到的问题保存到其个人空间(initialCollection),或在严格的目录管控场景下强制归档到指定集合(targetCollection)。
六、SQL 参数初始化:initialSqlParameters
对于基于 SQL 的下钻问题,initialSqlParameters用于注入初始参数值:
- 键为参数的slug(即 SQL 中的变量名);
- 仅在组件挂载时应用一次,用户在控件中的后续编辑不会回写宿主——这是文档强调的边界,意味着它适合“打开问题即带条件”的入口场景,而不适合做受控的双向绑定;
- 具体取值语义分三种情况:
- 设为某个值:应用该值;
- 设为
null:严格清空该参数,忽略参数本身的默认值; - 省略(或设为
undefined):回退到参数默认值(若无默认值则为null)。
类型定义可参考SqlParameterValues。
七、保存流程:isSaveEnabled/onSave/onBeforeSave
下钻探索往往伴随着“把这个问题存下来”的需求,保存能力由一组属性协同控制:
isSaveEnabled:总开关,控制保存按钮是否显示。onSave、onBeforeSave都只在它为true时才有意义;onBeforeSave:保存动作之前触发的异步回调。签名接收question(可能是undefined)与{ isNewQuestion: boolean }上下文,返回Promise<void>。你可以在其中执行校验、上报或“先保存再继续”的异步流程;由于是异步钩子,也可用于阻止/放行保存逻辑;onSave:用户保存成功时触发的同步回调。签名同样接收question与上下文,但上下文多出一个可选的dashboardTabId(当问题被保存到某个仪表盘标签页时提供),并携带isNewQuestion标记,便于区分“新建保存”与“更新已有问题”。
三者组合可以完整覆盖“保存前校验 → 保存成功回调 → 新/旧问题分流”的宿主侧集成需求。
八、运行时回调:onRun
onRun在下钻问题“运行更新”时触发——包括用户修改问题后点击编辑器中的Visualize按钮。回调携带最新的MetabaseQuestion(可能为undefined),是宿主监听问题内容变化的统一入口。与onSave不同,onRun不依赖isSaveEnabled,只要问题发生运行态更新就会触发,适合用来同步 URL 状态、记录埋点或联动外部 UI。
九、功能开关:withAlerts/withDownloads/withChartTypeSelector/withEditorButton
这组布尔属性决定下钻问题暴露哪些功能入口:
withAlerts:是否允许在该问题上创建告警(alerts)。对下钻出来的临时分析结果,通常无需告警,可关闭以减少干扰;withDownloads:是否允许下载查询结果,开放 CSV/Excel 等导出能力;withChartTypeSelector:是否显示图表类型选择器及对应设置按钮。文档注明仅在使用默认布局时相关——即当采用InteractiveQuestion的标准渲染布局(而非完全自定义组合子组件)时才生效;withEditorButton:是否显示编辑器按钮,同样仅在使用默认布局时相关。
这四个开关与title(默认显示)共同构成了“默认布局瘦身”的基本手段:通过关闭不想要的入口,宿主可以精确还原自己想要的嵌入交互密度。
十、插件扩展:plugins
plugins类型为MetabasePluginsConfig。官方文档对该字段本身未展开描述,但从 SDK 的整体插件体系可以推断,它用于注入与问题渲染、点击行为相关的插件配置(例如自定义 click actions)。需要深度定制时,可结合MetabasePluginsConfig、MetabaseClickActionPluginsConfig等关联类型查阅。
十一、源码印证:这些 Props 如何被消费
在仓库源码中,这些属性并非“文档里的摆设”,而是被真实解析与校验:
运行时 Schema 校验:InteractiveQuestion.schema.ts 使用 Yup 定义了
InteractiveQuestionInternalProps的校验规则。DrillThroughQuestionProps中的children、className、entityTypes、dataPicker、height、initialSqlParameters、isSaveEnabled、onRun、onSave、plugins、style、targetCollection、initialCollection、title、width、withChartTypeSelector、withEditorButton、withDownloads、withAlerts全部出现在该校验 Schema 中;同时 Schema 通过hasEntityProp测试强制要求questionId、token、card、query四者至少提供一个,否则抛出 “questionId, token, card, or query is required”。这说明下钻问题的 Props 在运行时会经过白名单式校验(.noUnknown()拒绝未知属性)。组件透传:InteractiveQuestion.tsx 将
title、withDownloads、isSaveEnabled、withAlerts显式取出,连同其余 Props 一并传给SdkQuestion,最终进入统一的问题渲染与下钻处理管线。换句话说,下钻问题的保存、下载、告警开关与普通交互式问题共享同一套实现。下钻行为的测试覆盖:仓库在 SdkQuestion-drills.unit.spec.tsx 中针对 SdkQuestion 的下钻行为编写了单元测试,可作为理解下钻流程(如何由点击行为生成新的下钻问题)的参考入口。
此外,SDK 侧还提供了与下钻相关的内部回调(如 Schema 中的onDrillThrough、onNavigateBack),用于更精细的下钻导航控制。
十二、综合示例:一个可落地的下钻问题配置
结合上述属性,一个典型的宿主集成示例大致如下(示意代码,体现属性组合方式):
import { InteractiveQuestion } from "@metabase/embedding-sdk-react"; export function DrillThroughView({ questionId }) { return ( <InteractiveQuestion questionId={questionId} title="下钻明细" width={960} height={640} // 允许下载与告警 withDownloads withAlerts // 启用完整数据选择器,并限定可用实体类型 dataPicker="staged" entityTypes={["table", "model"]} // 保存相关:默认归入指定集合,并挂接保存前后回调 isSaveEnabled initialCollection={42} onBeforeSave={async (question, { isNewQuestion }) => { // 保存前的异步校验/上报 }} onSave={(question, { isNewQuestion }) => { // 保存成功后的处理 }} // 监听问题运行更新 onRun={(question) => { // 同步 URL / 埋点 }} /> ); }说明:
entityTypes的具体取值请以EmbeddingEntityType为准;上例中的字符串仅用于示意。
十三、实践建议与边界
- 按需开启保存链路:
isSaveEnabled关闭时,onSave、onBeforeSave不会触发,无需无谓绑定; - 明确
initialCollection与targetCollection的取舍:要“允许用户改选”用前者,要“强制归档”用后者,且二者同时设置时后者生效; initialSqlParameters是单向的:只在挂载时生效一次,双向同步请走sqlParameters/onSqlParametersChange等受控通道(见 Schema 中的对应字段);- 默认布局相关开关的适用范围:
withChartTypeSelector、withEditorButton仅在采用默认布局时生效,若使用InteractiveQuestion.ChartTypeSelector、InteractiveQuestion.EditorButton等组合子组件自行搭建布局,则由组合方式直接决定可见性; - Props 白名单:从 Schema 的
.noUnknown()可以推断,传入未声明的属性会在运行时校验中报错,请严格按文档所列属性配置。
如需进一步查阅关联类型,可继续阅读仓库中的 InteractiveQuestionProps、MetabaseQuestion、SdkCollectionId 与 EmbeddingDataPicker 等文档,并与 InteractiveQuestion.tsx 的实现对照理解。
【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考