Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
利用Bokeh CustomJS动态控制DataTable列可见性_创想鸟

利用Bokeh CustomJS动态控制DataTable列可见性

利用Bokeh CustomJS动态控制DataTable列可见性

本教程详细介绍了如何使用bokeh的customjs回调功能,根据multichoice部件的选择动态控制datatable组件的列可见性。文章通过一个实际案例,指出并解决了javascript布尔类型大小写敏感的常见错误,并提供了完整的代码示例和详细解释,帮助开发者高效实现交互式数据表格功能。

引言

在构建交互式数据可视化应用时,根据用户输入动态调整数据展示是常见的需求。Bokeh提供了强大的CustomJS回调机制,允许开发者在客户端(浏览器)直接执行JavaScript代码,从而实现高性能的交互。本教程将聚焦于如何利用CustomJS,结合MultiChoice选择器,动态控制DataTable中特定列的可见性。

Bokeh交互式组件基础

在深入CustomJS之前,我们首先需要了解涉及到的Bokeh组件:

ColumnDataSource: Bokeh数据流的核心,用于存储数据并驱动图表和表格的更新。DataTable: 用于显示表格数据,其列由TableColumn对象定义。TableColumn: 定义DataTable中的单个列,包括field(对应ColumnDataSource中的列名)、title(列标题)和visible(控制列的可见性)等属性。MultiChoice: 一个多选下拉菜单部件,用户可以选择一个或多个选项。其value属性会包含当前选中的所有选项列表。CustomJS: 一个JavaScript回调对象,可以在Bokeh模型的特定属性发生变化时触发执行。

实现动态列可见性的步骤

我们的目标是当用户在MultiChoice中选择一个元素时,DataTable中对应字段的列变为可见。

1. 初始化DataTable列

首先,我们需要创建DataTable及其列。通常,我们会将所有潜在的列都定义好,并根据初始需求设置它们的visible属性。

from bokeh.models import ColumnDataSource, CustomJSfrom bokeh.models.widgets import DataTable, TableColumn, MultiChoicefrom bokeh.io import showfrom bokeh.layouts import columnimport pandas as pd# 示例数据data = {    'Li': [1, 2, 3],    'Be': [4, 5, 6],    'B': [7, 8, 9],    'C': [10, 11, 12]}df = pd.DataFrame(data)filtered_table_data = df[["Li", "Be", "B", "C"]] # 假设初始显示所有数据,但列可能隐藏filtered_table_source = ColumnDataSource(data=filtered_table_data)# 初始化所有列为不可见,或根据需求设置filtered_table_cols = [    TableColumn(field='Li', title='Li', width=75, visible=False),    TableColumn(field='Be', title='Be', width=75, visible=False),    TableColumn(field='B', title='B', width=75, visible=False),    TableColumn(field='C', title='C', width=75, visible=False),]filtered_table = DataTable(source=filtered_table_source, columns=filtered_table_cols, width=300, height=100)# MultiChoice部件,选项从DataFrame列中获取multi_choice = MultiChoice(value=[], options=df.columns.tolist(), title='Select elements:')

在这个例子中,我们创建了Li, Be, B, C四列,并默认将它们设置为visible=False。

2. 编写CustomJS回调函数

CustomJS回调函数是实现动态行为的核心。它接收args字典中定义的Bokeh模型对象,并在code字符串中执行JavaScript逻辑。

// JavaScript回调代码骨架/*for (var i = 0; i < filtered_table.columns.length; i++) {    var currentColumn = filtered_table.columns[i];    // 默认所有列都应该先隐藏,再根据选择显示    currentColumn.visible = false; // 每次选择时重置所有列为隐藏    for (var j = 0; j < multi_choice.value.length; j++) {        var selectedValue = multi_choice.value[j];        if (currentColumn.field === selectedValue) {            currentColumn.visible = true; // 注意:这里是关键!            break; // 找到匹配项后跳出内层循环,避免重复设置        }    }}filtered_table.change.emit(); // 通知Bokeh模型数据已更改*/

3. 绑定回调函数

最后,我们将CustomJS对象绑定到MultiChoice部件的value属性的js_on_change事件上。这意味着每当MultiChoice的选中值发生变化时,CustomJS代码就会被执行。

callback = CustomJS(args=dict(multi_choice=multi_choice, filtered_table=filtered_table), code="""    for (var i = 0; i < filtered_table.columns.length; i++) {        var currentColumn = filtered_table.columns[i];        currentColumn.visible = false; // 每次选择时,先将所有列设为不可见        for (var j = 0; j < multi_choice.value.length; j++) {            var selectedValue = multi_choice.value[j];            if (currentColumn.field === selectedValue) {                currentColumn.visible = true; // 将选中的列设为可见                break; // 找到匹配项后,无需继续检查该列的其他选择            }        }    }    filtered_table.change.emit(); // 通知Bokeh模型数据已更改""")multi_choice.js_on_change("value", callback)# 布局并显示layout = column(multi_choice, filtered_table)show(layout)

关键问题与解决方案:JavaScript布尔类型

原始代码中遇到的问题是:

filtered_table.columns[i].visible=True;

这里的错误在于使用了Python的布尔类型True。JavaScript是大小写敏感的,其布尔类型为小写的true和false。因此,正确的写法应该是:

filtered_table.columns[i].visible = true;

这是一个非常常见的跨语言(Python到JavaScript)编程陷阱。修改后,CustomJS将能够正确地设置TableColumn的可见性。

完整代码示例

将上述所有部分整合,并修正布尔类型问题,得到完整的可运行代码:

from bokeh.models import ColumnDataSource, CustomJSfrom bokeh.models.widgets import DataTable, TableColumn, MultiChoicefrom bokeh.io import showfrom bokeh.layouts import columnimport pandas as pd# 示例数据data = {    'Li': [1, 2, 3],    'Be': [4, 5, 6],    'B': [7, 8, 9],    'C': [10, 11, 12]}df = pd.DataFrame(data)# 准备ColumnDataSourcefiltered_table_data = df[["Li", "Be", "B", "C"]]filtered_table_source = ColumnDataSource(data=filtered_table_data)# 初始化DataTable列,所有列默认不可见filtered_table_cols = [    TableColumn(field='Li', title='Li', width=75, visible=False),    TableColumn(field='Be', title='Be', width=75, visible=False),    TableColumn(field='B', title='B', width=75, visible=False),    TableColumn(field='C', title='C', width=75, visible=False),]# 创建DataTablefiltered_table = DataTable(source=filtered_table_source, columns=filtered_table_cols, width=300, height=100)# 创建MultiChoice部件multi_choice = MultiChoice(value=[], options=df.columns.tolist(), title='Select elements:')# CustomJS回调函数# 注意:JavaScript中的布尔值是小写的 true 和 falsecallback = CustomJS(args=dict(multi_choice=multi_choice, filtered_table=filtered_table), code="""    // 遍历DataTable的所有列    for (var i = 0; i < filtered_table.columns.length; i++) {        var currentColumn = filtered_table.columns[i];        // 每次选择时,先将所有列设为不可见,确保未选中的列被隐藏        currentColumn.visible = false;         // 遍历MultiChoice中选中的值        for (var j = 0; j < multi_choice.value.length; j++) {            var selectedValue = multi_choice.value[j];            // 如果当前列的field与选中的值匹配,则设为可见            if (currentColumn.field === selectedValue) {                currentColumn.visible = true; // 修正:使用小写 'true'                break; // 找到匹配项后,跳出内层循环,提高效率            }        }    }    // 通知Bokeh模型,DataTable的属性已更改,需要重新渲染    filtered_table.change.emit();                """)# 将CustomJS回调绑定到MultiChoice的"value"属性变化事件multi_choice.js_on_change("value", callback)# 布局并显示layout = column(multi_choice, filtered_table)show(layout)

代码解析

for (var i = 0; i red_table.columns.length; i++): 这是一个外层循环,用于遍历DataTable中的所有TableColumn对象。currentColumn.visible = false;: 在每次处理MultiChoice的选择时,首先将所有列的visible属性设置为false。这确保了如果用户取消选择某个列,该列能够被正确隐藏。for (var j = 0; j : 这是一个内层循环,用于遍历MultiChoice当前选中的所有值。multi_choice.value是一个字符串数组,包含了用户选择的选项。if (currentColumn.field === selectedValue): 比较当前TableColumn的field属性(即列对应的原始数据字段名)是否与MultiChoice中选中的某个值匹配。currentColumn.visible = true;: 如果匹配,则将该TableColumn的visible属性设置为true,使其可见。break;: 一旦找到匹配项并设置了可见性,就可以跳出内层循环,因为一个列只需要被设置为可见一次。filtered_table.change.emit();: 这是至关重要的一步。在JavaScript中直接修改Bokeh模型的属性后,需要显式调用change.emit()方法来通知Bokeh运行时,模型状态已发生变化,从而触发UI的重新渲染。如果没有这一行,即使属性值改变了,界面也可能不会更新。

注意事项与最佳实践

JavaScript布尔值大小写: 始终记住JavaScript的布尔值是true和false,而不是Python的True和False。change.emit(): 在CustomJS中修改Bokeh模型属性后,务必调用model.change.emit()来刷新视图。性能优化: 对于包含大量列的DataTable,每次都遍历所有列并重置可见性可能效率不高。但对于中小型表格,这种方法简单直观且足够高效。如果性能成为瓶颈,可以考虑更复杂的逻辑,例如只修改发生变化的列的可见性。初始状态: 确保DataTable的初始列可见性设置符合您的应用需求。错误处理: 在实际应用中,可以考虑添加错误处理逻辑,例如当MultiChoice的选项与DataTable的列字段不完全匹配时。

总结

通过本教程,我们学习了如何利用Bokeh的CustomJS回调功能,结合MultiChoice部件,动态控制DataTable的列可见性。关键在于理解CustomJS的执行机制,正确编写JavaScript代码(特别是注意布尔类型的大小写),以及在修改模型属性后调用change.emit()来刷新视图。掌握这些技巧将使您能够创建更具交互性和用户友好的Bokeh应用程序。

以上就是利用Bokeh CustomJS动态控制DataTable列可见性的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1539500.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
jQuery Mask 插件中实现电话号码固定前导零的教程
上一篇 2025年12月21日 11:39:38
将JSON对象数组转置为键值对列表的实用指南
下一篇 2025年12月21日 11:39:51

相关推荐

  • sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法

    sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法sublime怎么实现sass/scss的自动编译_sublime配置SASS自动编译方法

    安装LiveSassCompiler插件并配置路径后,保存SCSS文件可自动编译为CSS。1. 通过Package Control安装插件;2. 设置输入输出路径;3. 保存文件触发编译,提升开发效率。 Sublime Text 要实现 SASS/SCSS 的自动编译,可以通过安装插件并配置构建系统…

    2026年9月25日 • 用户投稿
    200
  • 解析音调调整指令:一个Java教程

    解析音调调整指令:一个Java教程解析音调调整指令:一个Java教程解析音调调整指令:一个Java教程解析音调调整指令:一个Java教程

    本文旨在提供一个清晰易懂的Java教程,用于解析包含音调调整指令的字符串。通过使用正则表达式,我们可以从复杂的输入字符串中提取乐器名称、调整方向和调整量。本教程将详细解释代码实现,并提供示例,帮助读者理解如何在Java中处理这类问题。 使用正则表达式解析音调调整指令 在音乐领域,音调的微调至关重要。…

    2026年9月25日 • 用户投稿
    000
  • 如何利用Debian Apache日志提升网站性能

    如何利用Debian Apache日志提升网站性能如何利用Debian Apache日志提升网站性能如何利用Debian Apache日志提升网站性能如何利用Debian Apache日志提升网站性能

    本文将阐述如何通过分析Debian系统下的Apache日志来提升网站性能。 一、日志分析基础 Apache日志记录了所有HTTP请求的详细信息,包括IP地址、时间戳、请求URL、HTTP方法和响应代码等。在Debian系统中,这些日志通常位于/var/log/apache2/access.log和/…

    2026年9月25日 • 用户投稿
    000
  • Java字符串高级解析:使用正则表达式处理复杂指令模式

    Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式Java字符串高级解析:使用正则表达式处理复杂指令模式

    本教程演示如何使用Java的java.util.regex包,通过正则表达式高效解析包含多条调音指令的复杂字符串。我们将学习构建匹配特定模式的正则表达式,并利用Pattern和Matcher类从输入字符串中准确提取乐器名称、调音方向和数值,从而将原始指令转换为清晰可读的输出格式。 1. 问题背景与挑…

    2026年9月25日 • 用户投稿
    000
  • 360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程

    360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程360极速浏览器怎么关闭热搜和新闻弹窗_360极速浏览器屏蔽热点资讯与弹窗教程

    关闭360极速浏览器热搜和新闻弹窗需三步操作:一、在“设置-实验室-其他设置”中关闭“启用‘360热点资讯’功能”;二、在“隐私设置-网站设置-弹出式窗口”中开启阻止;三、手动点击弹窗上的“不再弹出”选项。 如果您在使用360极速浏览器时频繁遭遇热搜和新闻弹窗干扰,影响正常浏览体验,这通常是因为浏览…

    2026年9月25日 • 用户投稿
    000
  • 怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算

    怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算怎么用豆包AI帮我优化NumPy运算 3个技巧让AI加速科学计算

    豆包ai可通过三个技巧优化numpy计算效率。1. 描述逻辑让ai生成高效向量化表达式,如用np.mean(arr * (arr > 0), axis=1)替代循环求每行正数均值;2. 提供现有代码让ai分析瓶颈并提出优化建议,如将显式循环改为np.where(np.sum(arr, axis…

    2026年9月25日 • 用户投稿
    000
  • Java中整数类型溢出行为详解:二进制补码与循环特性

    Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性Java中整数类型溢出行为详解:二进制补码与循环特性

    Java中原始整数类型在处理超出其范围的数值时,会遵循一种基于二进制补码的循环溢出机制。这意味着当正数溢出时会“回卷”为负数,反之亦然,如同数字在一个有限的圆环上循环。理解这一特性对于准确预测类型转换和算术运算结果至关重要。 计算机中的数值表示:位、字节与二进制 在计算机底层,所有数据都以二进制形式…

    2026年9月25日 • 用户投稿
    000
  • Java数据类型溢出:原理、预测与避免

    Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免Java数据类型溢出:原理、预测与避免

    本文旨在深入解析Java中数据类型溢出的现象,阐述其背后的二进制补码原理,并提供预测溢出结果的方法。通过理解数据在计算机中的存储方式,以及溢出时数值的循环特性,开发者可以更好地掌握Java中的数据类型,避免潜在的错误。 数据在计算机中的存储:二进制补码 计算机底层使用二进制(bits)来表示所有数据…

    2026年9月25日 • 用户投稿
    000
  • 夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程

    夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程夸克浏览器PC版怎么下载安装_夸克浏览器电脑版下载与安装全流程

    首先访问夸克官网下载电脑版安装包,运行QuarkSetup.exe完成安装并创建快捷方式,最后启动浏览器登录阿里系账号同步数据并进行个性化设置。 如果您尝试在电脑上使用夸克浏览器,但尚未安装其桌面版本,则需要完成下载与安装流程。以下是解决此问题的步骤: 本文运行环境:联想小新Air 14,Windo…

    2026年9月25日 • 用户投稿
    000
  • sublime怎么运行php文件 _sublime PHP文件运行方法

    sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法sublime怎么运行php文件 _sublime PHP文件运行方法

    首先确保PHP已安装并加入环境变量,然后在Sublime Text中创建PHP构建系统:通过Tools → Build System → New Build System…添加对应操作系统的JSON配置,保存为PHP.sublime-build至User目录;接着打开.php文件按Ctrl+ B或C…

    2026年9月25日 • 用户投稿
    000
  • PDF转Word怎么一键转换_PDF一键转Word的简单操作流程

    PDF转Word怎么一键转换_PDF一键转Word的简单操作流程PDF转Word怎么一键转换_PDF一键转Word的简单操作流程PDF转Word怎么一键转换_PDF一键转Word的简单操作流程PDF转Word怎么一键转换_PDF一键转Word的简单操作流程

    可通过在线工具、Word、WPS或Adobe软件将PDF转为Word。在线工具如iLovePDF上传即转;2. Word可直接打开PDF另存为.docx;3. WPS点击“PDF转Word”一键转换;4. Adobe Acrobat选择“导出PDF”为Word格式,精准保留原排版。 如果您需要将PD…

    2026年9月25日 • 用户投稿
    200
  • safari浏览器如何管理和删除Cookie_safari浏览器Cookie管理和删除方法

    清除或管理Safari浏览器的Cookie可解决网页加载异常、登录状态丢失等问题。1、通过“设置-隐私-管理网站数据”可查看并删除特定网站的Cookie;2、点击“移除全部”可彻底清除所有Cookie,重置浏览状态;3、勾选“阻止所有Cookie”能增强隐私保护,但会影响网站正常功能;4、使用“无痕…

    2026年9月25日
    100
  • Java中数据类型溢出的原理及预测方法

    Java中数据类型溢出的原理及预测方法Java中数据类型溢出的原理及预测方法Java中数据类型溢出的原理及预测方法Java中数据类型溢出的原理及预测方法

    本文旨在阐明Java中当数值超出所选数据类型范围时发生的溢出现象,并提供预测溢出结果的方法。文章将深入探讨计算机中数值的存储方式,特别是补码表示法,以及溢出时数值如何“环绕”的原理。通过理解这些概念,读者可以准确预测Java中数据类型溢出的结果。 理解计算机中的数值表示:补码 在计算机中,所有数据最…

    2026年9月25日 • 用户投稿
    100
  • uc浏览器怎么添加书签到主页_UC浏览器将书签添加到首页快捷方式

    uc浏览器怎么添加书签到主页_UC浏览器将书签添加到首页快捷方式uc浏览器怎么添加书签到主页_UC浏览器将书签添加到首页快捷方式uc浏览器怎么添加书签到主页_UC浏览器将书签添加到首页快捷方式uc浏览器怎么添加书签到主页_UC浏览器将书签添加到首页快捷方式

    首先可通过书签管理长按添加,其次在浏览时点击菜单选择添加到桌面,最后部分版本可直接使用工具栏+按钮创建快捷方式。 如果您希望快速访问常用网站,可以通过将书签添加到UC浏览器主页来实现便捷操作。这一功能可以帮助您在启动浏览器时一键跳转至目标页面。 本文运行环境:小米14,Android 14 一、通过…

    2026年9月25日 • 用户投稿
    100
  • 使用 DynamoDBMapper 进行条件更新操作

    使用 DynamoDBMapper 进行条件更新操作使用 DynamoDBMapper 进行条件更新操作使用 DynamoDBMapper 进行条件更新操作使用 DynamoDBMapper 进行条件更新操作

    本文将介绍如何利用 DynamoDBMapper 在 Java 中执行基于当前值的条件更新操作,特别是使用 “ADD” 操作来递减账户余额。虽然 DynamoDBMapper 默认不支持直接使用更新表达式,但通过配置 SaveBehavior,可以实现类似的效果。 Dynam…

    2026年9月25日 • 用户投稿
    000
  • 解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题

    解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题解决JavaFX应用导出为可运行JAR后FXMLLoader资源加载失败的问题

    本文旨在解决JavaFX应用在Eclipse中正常运行,但导出为可运行JAR包后,因FXMLLoader无法找到FXML资源文件而抛出IllegalStateException: Location is not set异常的问题。核心解决方案是调整FXMLLoader.setLocation()方法…

    2026年9月25日 • 用户投稿
    100
  • Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程

    Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程Chrome浏览器怎么设置最小字体大小_网页最小显示字体设置教程

    首先调整Chrome最小字体设置至12像素以上,其次可通过页面缩放或开发者工具临时修改字体大小以提升可读性。 如果您发现Chrome浏览器中某些网页的字体过小导致阅读困难,这可能是因为浏览器或网页本身设置了较小的最小字体限制。以下是解决此问题的步骤: 本文运行环境:Dell XPS 13,Windo…

    2026年9月25日 • 用户投稿
    100
  • Debian Apache日志对SEO有何影响

    debian apache日志记录了网站的所有访问请求,包括ip地址、请求类型、响应状态等详细信息。这些日志对于seo有以下几个方面的影响: SEO GPT 免费的白帽SEO,PPC和网站经销商平台 17 查看详情 Apache日志对SEO的重要性 监控网站流量和用户行为:通过分析Apache访问日…

    2026年9月25日
    000
  • Java多态中成员变量是否具有动态绑定特性

    成员变量不具有动态绑定特性,其访问基于引用变量的声明类型而非实际对象类型。例如,当父类和子类存在同名成员变量时,通过父类引用访问该变量将获取父类中的值,即使实际对象是子类实例。这体现了静态绑定,即在编译期确定访问的变量。相比之下,实例方法支持动态绑定(后期绑定),在运行时根据对象的实际类型决定调用哪…

    2026年9月25日
    100
  • 2025 上半年中国蓝牙耳机市场份额出炉:小米第一

    2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一2025 上半年中国蓝牙耳机市场份额出炉:小米第一

    根据 idc 最新发布的数据,2025 年上半年中国蓝牙耳机市场出货量约为 5998 万台,同比增长 7.5%。其中,小米以 16.5% 的市场份额位居榜首。值得注意的是,耳夹式耳机在 2025 年上半年的市场规模与增速首次超越耳挂式产品,实现出货量 651 万台,同比增长高达 41.0%。 小米耳…

    2026年9月25日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信