如何在Qwik这类虚拟DOM框架中为ChartJS等库传递DOM元素?
背景
我过往曾大量使用React、Vue和Angular,经常需要基于筛选数据在应用中生成图表。近期我因Qwik的性能优势尝试使用它,并想通过ChartJs创建图表,但ChartJs有适配React、Vue、Angular、Svelte等的专属库,却没有适配Qwik的版本。
问题
Highcharts和ChartJs这类插件通常需要传入DOM元素来确定渲染输出的位置,但在虚拟DOM环境中,我无法在组件内运行JS选择器脚本获取DOM元素并传入函数,因此目前无法在Qwik项目中使用ChartJs。
尝试方案
我曾寻找解决方案但未找到可行方法,ChartJs官方文档中的原生JS实现代码如下:
new Chart( document.getElementById('acquisitions'), { type: 'bar', data: { labels: data.map(row => row.year), datasets: [ { label: 'Acquisitions by year', data: data.map(row => row.count) } ] } } );
正如预期,document.getElementById在Qwik组件内无法生效,这正是我的卡点。我已创建useMount$()函数准备放置图表生成逻辑,也参考过React的ref方案,但没有更多进展。我明白查看ChartJs的React库源码能找到线索,但目前能力有限,于是向社区寻求指引。
在Qwik官方文档中搜索“ref”没有结果,但我找到一位开发者的Git项目并尝试复制其ref用法:
子组件代码:
import { component$, useMount$, Ref, useStylesScoped$ } from "@builder.io/qwik"; import { Chart } from 'chart.js/auto'; interface GraphProps { data: object[]; reference: Ref<Element>; } export default component$((props: GraphProps) => { useStylesScoped$(styles); useMount$(() => { new Chart( props.reference.value, { <... options here ...> } ); }); return ( <div id="chartContent"> </div> ); });
父组件代码:
import { component$, useRef } from "@builder.io/qwik"; import ContentCard from "../components/contentCard/contentCard"; import ChartJSGraph from "../components/chartJSGraph/chartJSGraph"; ... export default component$(() => { const leftChartContainer = useRef(); return ( <div> <div className="row"> <ContentCard> <div className="graph-container"> <ChartJSGraph data={[ { year: 2010, count: 10 }, ... ]} reference={leftChartContainer} /> </div> </ContentCard> </div> </div> ) });
这些代码来自一位YouTube博主的项目,可能已过时,并非可靠来源,且目前我仍未在官方文档中找到ref的正式用法。
内容的提问来源于stack exchange,提问作者Muhtasim Fuad Showmik
相关产品推荐
相关产品推荐

