Vue3中使用D3-Hexbin报错:_d3_hexbin__WEBPACK_IMPORTED_MODULE_3__ is not a function
解决D3-Hexbin导入报错
TypeError: ... is not a function的问题 核心问题:导入方式错误
d3-hexbin的ES模块采用默认导出而非命名导出,你用import * as d3hexbin会把整个模块对象导入,直接调用d3hexbin()自然会报错(对象不是函数)。
正确导入方案
有两种可行的导入方式,选一种即可:
方案1:直接默认导入hexbin函数
import * as d3 from "d3"; import hexbin from "d3-hexbin"; // 直接使用导入的hexbin函数创建实例 const hex = hexbin().radius(9).extent([ [0, 0], [hexW, hexH] ]);
方案2:将hexbin挂载到D3对象(贴合传统用法)
如果你习惯用d3.hexbin()的写法,可以手动挂载:
import * as d3 from "d3"; import { hexbin } from "d3-hexbin"; // 把hexbin注册到d3对象上 d3.hexbin = hexbin; // 之后即可用d3.hexbin()创建实例 const hex = d3.hexbin().radius(9).extent([ [0, 0], [hexW, hexH] ]);
代码额外优化点
你当前代码里存在重复创建hexbin实例的冗余:
// 这行是多余的,直接用导入后的hexbin函数即可 let hexbin = d3hexbin(); // 后面又重新创建了一次 const hex = hexbin().radius(9)...
删除第一行冗余代码,避免变量名冲突和逻辑混乱。
数据处理验证
最后确认dataHexMap.values()是否是hexbin处理后的正确数据:
通常hexbin需要先传入原始坐标数组生成bin数据:
// 假设rawData是你的经纬度坐标数组,格式如[[lon1, lat1], [lon2, lat2], ...] const bins = hex(rawData); // 然后用bins作为data的参数 .selectAll("path") .data(bins)
如果dataHexMap.values()不是经过hexbin处理的结果,也会导致渲染失败。
内容的提问来源于stack exchange,提问作者Skouzini
相关产品推荐
相关产品推荐

