news 2026/9/10 1:23:46

Metabase Embedding SDK 中 CreateQuestion 组件的弃用说明与 InteractiveQuestion 迁移指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Metabase Embedding SDK 中 CreateQuestion 组件的弃用说明与 InteractiveQuestion 迁移指南

Metabase Embedding SDK 中 CreateQuestion 组件的弃用说明与 InteractiveQuestion 迁移指南

【免费下载链接】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

本文围绕 CreateQuestion.md 这一 API 参考文档展开,说明 Metabase Embedding SDK(@metabase/embedding-sdk-react)中CreateQuestion组件已正式弃用,并给出以<InteractiveQuestion questionId="new" />为替代方案的全量迁移指引,包括"new"/"new-native"两种新建模式的语义、CreateQuestionProps完整属性清单、以及仓库源码与单元测试层面的验证依据。读完本文,你将掌握在嵌入式 React 应用中安全替换弃用组件、继续使用"新建问题"能力的完整实操方案。

一、CreateQuestion 组件:签名与弃用状态

在 Metabase Embedding SDK 的 API 参考体系中,CreateQuestion.md 是 api 索引 中 "CreateQuestion" 一节的组成部分。该文档给出的组件签名如下:

function CreateQuestion(props: CreateQuestionProps | undefined): Element;

三个关键信息:

项目内容
参数props,类型为CreateQuestionProps|undefined,即属性对象可选
返回值ReactElement,即渲染出一个可嵌入的问题创建界面
弃用标记文档中明确标注~~CreateQuestion~~(删除线),并给出替代方案

在 api 索引 中,CreateQuestionCreateQuestionProps均被列为条目,但组件名带删除线,属于"已弃用但保留文档供迁移参考"的 API 形态。

官方弃用说明

CreateQuestion.md 文档的 "Deprecated" 一节是核心结论,原文内容为:

Use<InteractiveQuestion questionId="new" />instead.

即:不要再使用CreateQuestion组件,请改用InteractiveQuestion组件,并传入questionId="new"。这条迁移路径意味着"新建问题"的能力并未消失,而是被统一收编到了更通用的InteractiveQuestion组件之下。

二、CreateQuestionProps:被继承的完整属性清单

虽然组件本身被弃用,但其承载的配置能力——即 CreateQuestionProps.md 中列出的全部属性——几乎原样延续到了InteractiveQuestionProps中(对比 InteractiveQuestionProps.md 可发现属性集合高度一致)。理解这些属性,等于同时理解了迁移后的InteractiveQuestion的能力边界。

完整属性表如下:

属性类型说明
className?string添加到根元素的自定义 class 名
dataPicker?EmbeddingDataPicker控制问题中数据源选择菜单;设置为"staged"可使用完整数据选择器
entityTypes?EmbeddingEntityType[]指定数据选择器中可用的实体类型数组
height?Height<string \| number>CSS 尺寸值,指定组件高度
hiddenParameters?string[]要隐藏的参数列表
initialCollection?SdkCollectionId保存弹窗中集合选择器预选的集合;与targetCollection不同,选择器仍然可见,用户可改选其他集合;设置了targetCollection时此属性被忽略
initialSqlParameters?SqlParameterValuesSQL 参数的初始值(按 slug 键控),仅在挂载时应用一次,之后用户在控件中的编辑不会回传宿主
isSaveEnabled?boolean是否显示保存按钮
onBeforeSave?(question, context) => Promise<void>保存前触发的回调,仅在isSaveEnabled = true时相关;contextisNewQuestion标记
onNavigateBack?() => void用户点击返回按钮时触发的回调
onRun?(question) => void问题更新时触发(包括用户点击编辑器中的Visualize按钮)
onSave?(question, context) => void用户保存问题时触发,仅在isSaveEnabled = true时相关
onSqlParametersChange?(payload: SqlParameterChangePayload) => voidSQL 参数变化时触发;payload 的source区分初始状态('initial-state')、用户编辑('manual-change')与自动更新('auto-change'
onVisualizationChange?(display) => void可视化类型变化时触发,display 取值覆盖"object""table""bar""line""pie""scalar""row""area""combo""pivot""smartscalar""gauge""progress""funnel""map""scatter""boxplot""waterfall""sankey""treemap""list"
plugins?MetabasePluginsConfig插件配置
sqlParameters?SqlParameterValues受控的 SQL 参数值(按 slug 键控),每次渲染都会替换问题的参数值;需配合onSqlParametersChange保持与用户编辑同步
style?CSSProperties添加到根元素的自定义 style 对象
targetCollection?SdkCollectionId问题保存到的目标集合;设置后会隐藏保存弹窗中的集合选择器,仅对交互式问题适用
title?SdkQuestionTitleProps是否显示问题标题,以及是否用自定义标题替换默认标题;默认显示
width?Width<string \| number>CSS 尺寸值,指定组件宽度
withAlerts?boolean是否允许在问题上设置告警
withChartTypeSelector?boolean是否显示图表类型选择器及对应设置按钮,仅在默认布局下相关
withDownloads?boolean是否允许下载问题结果
withEditorButton?boolean是否显示编辑器按钮,仅在默认布局下相关

其中几个属性在迁移到InteractiveQuestion后依然有效且常见:isSaveEnabled控制保存流程、targetCollection/initialCollection控制保存位置、withDownloads/withAlerts控制能力开关、onBeforeSave/onSave钩入保存生命周期。

三、替代方案:InteractiveQuestion 与 questionId="new"

3.1 SdkQuestionId 的四种取值

替代方案的核心在于questionId属性,其类型定义见 SdkQuestionId.md:

type SdkQuestionId = number | "new" | "new-native" | SdkEntityId;

官方文档给出的四种用法示例:

// 数值 ID:取自问题 URL const questionId: SdkQuestionId = 123; // 实体 ID 字符串 const questionId: SdkQuestionId = "abc123def456"; // 新建 notebook 风格问题(替代 CreateQuestion) const questionId: SdkQuestionId = "new"; // 新建原生 SQL 问题 const questionId: SdkQuestionId = "new-native";

其中"new"正是文档指定的CreateQuestion替代值,而"new-native"则对应"新建原生 SQL 查询"的模式。关于这两个取值在 InteractiveQuestionProps.md 的questionId属性说明中有明确语义:

  • new—— 显示用于创建新问题的 notebook 编辑器(可视化查询构建器);
  • new-native—— 显示用于创建新原生问题的 SQL 编辑器。

3.2 最小可用示例:新建 notebook 问题

仓库中 new-question.tsx 提供了开箱即用的完整示例:

import React from "react"; import { InteractiveQuestion, MetabaseProvider, defineMetabaseAuthConfig, } from "@metabase/embedding-sdk-react"; const authConfig = defineMetabaseAuthConfig({ metabaseInstanceUrl: "https://your-metabase.example.com", }); export default function App() { return ( <MetabaseProvider authConfig={authConfig}> <InteractiveQuestion questionId="new" /> </MetabaseProvider> ); }

要点拆解:

  1. 应用外层必须用MetabaseProvider包裹,并通过defineMetabaseAuthConfig传入 Metabase 实例地址与认证配置;
  2. questionId固定为字符串"new",组件即渲染出 notebook 新建界面,用户可以从零开始选择数据、聚合、可视化并保存;
  3. 这一写法完全等价于旧版<CreateQuestion />的用途,且无需任何额外包装。

3.3 变体:新建原生 SQL 问题

若希望用户直接进入 SQL 编辑器,参照 new-native-question.tsx:

import React from "react"; import { InteractiveQuestion, MetabaseProvider, defineMetabaseAuthConfig, } from "@metabase/embedding-sdk-react"; const authConfig = defineMetabaseAuthConfig({ metabaseInstanceUrl: "https://your-metabase.example.com", }); export default function App() { return ( <MetabaseProvider authConfig={authConfig}> <InteractiveQuestion questionId="new-native" /> </MetabaseProvider> ); }

两种模式只需切换questionId字符串即可。

四、源码级验证:new / new-native 的真实处理逻辑

上述语义并非文档单方面约定,在仓库前端源码中有直接实现证据。核心文件为 InteractiveQuestion.tsx:

const isNewQuestion = resolvedQuestionId === "new" || resolvedQuestionId === "new-native";

随后(第 143-146 行)在埋点上报中进一步区分两种新建模式:

isNewQuestion ? { id_new: resolvedQuestionId === "new", id_new_native: resolvedQuestionId === "new-native", is_save_enabled: isSaveEnabled, with_title: title !== false, with_downloads: withDownloads, with_alerts: withAlerts, } : { /* 非新建问题的上报字段 */ };

此外,该文件第 124-133 行的注释还说明了一个边界情形:当通过query属性渲染(例如 Metabotnavigate_to)且未传questionId时,会从 card 的dataset_query.type推导出应打开 notebook 还是 SQL 编辑器,保证原生查询场景与"new-native"行为一致(对应内部 issue EMB-2042)。

单元测试 InteractiveQuestion.unit.spec.tsx 中也有专门的测试分组:

describe('questionId: "new"', () => { // 验证渲染 notebook 新建界面… });

测试覆盖了questionId: "new"的默认渲染(第 378 行setup({ questionId: "new" }))以及dataPicker: "staged"开启完整数据选择器的组合(第 392 行),印证了"新建模式 + 数据选择器配置"是官方验证过的受支持用法。

五、从 CreateQuestion 到 InteractiveQuestion 的迁移要点

结合弃用文档、属性清单与源码实现,迁移可按以下清单执行:

  1. 替换组件:将<CreateQuestion {...props} />改为<InteractiveQuestion questionId="new" {...props} />;若原先是"新建 SQL 问题"场景,则使用questionId="new-native"
  2. 核对属性兼容性CreateQuestionProps中的classNamestylewidthheighttitleisSaveEnabledtargetCollectioninitialCollectiondataPickerentityTypeshiddenParameterspluginswithDownloadswithAlertswithChartTypeSelectorwithEditorButtononRunonSaveonBeforeSaveonNavigateBackonVisualizationChangesqlParametersinitialSqlParametersonSqlParametersChange等属性在InteractiveQuestionProps中均有对应项,可直接平移。
  3. 确认 Provider 就位InteractiveQuestion与旧组件一样依赖MetabaseProvider提供的认证与主题上下文,迁移时不要遗漏。
  4. 处理 SQL 参数:涉及原生查询参数时,用sqlParameters(受控)搭配onSqlParametersChange保持双向同步;仅需初始值则用initialSqlParameters(一次性应用)。
  5. 回归验证:可参照仓库单元测试覆盖的两个维度——默认 notebook 渲染、dataPicker="staged"完整数据选择器,确认迁移后功能无回退。

六、小结

CreateQuestion是 Metabase Embedding SDK 中已被正式弃用的组件,官方在 CreateQuestion.md 中给出的替代方案是<InteractiveQuestion questionId="new" />。这一迁移并非功能裁剪:其属性能力完整保留在InteractiveQuestionProps中,"新建 notebook 问题"与"新建原生 SQL 问题"分别通过questionId="new"questionId="new-native"表达,并有 InteractiveQuestion.tsx 的源码逻辑与 InteractiveQuestion.unit.spec.tsx 的测试用例双重背书。新接入的开发者应直接使用InteractiveQuestion新建模式,存量代码则按上文清单平滑迁移。

【免费下载链接】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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 1:23:12

Python体育用品商店系统开发详解:从Flask到PyInstaller打包

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/10 1:21:05

数字孪生三维场景中点击模型切换颜色的实现与方案选型

在数字孪生项目里&#xff0c;三维场景的交互一直是个让人又爱又恨的环节。很多刚接触这块的朋友都会问&#xff1a;我点击一个设备模型&#xff0c;场景里给它加个高亮效果&#xff0c;这已经实现了&#xff0c;但用户觉得还不够&#xff0c;能不能点击之后直接把模型的颜色给…

作者头像 李华
网站建设 2026/9/10 1:20:10

Go语言性能优化实战:从基准测试到pprof分析的完整闭环

无论你是一个刚写完第一个 Web 服务的 Go 新手&#xff0c;还是已经在生产环境里运维了好几个高并发模块的工程师&#xff0c;一旦线上流量涨上来、延迟报表开始飘红&#xff0c;你迟早会撞上同一个问题&#xff1a;这段代码到底慢在哪、内存悄悄涨到天上去了又是谁干的。我做过…

作者头像 李华
网站建设 2026/9/10 1:17:59

微电网多阶段鲁棒调度模型MATLAB复现与CCG算法实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华