echarts图表当年月筛选项切换后无法重新刷新问题

博客指出特殊情况下用ECharts实例并setOption()无法刷新表格内容,如修改div容器内部标签。原因是破坏了第一次渲染的div容器结构,ECharts渲染会匹配div容器属性值,破坏结构则无法重新渲染。给出解决办法,但此操作会重新操作DOM影响性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在特殊情况下,我们可能是用echarts实例并且setOption()但无法刷新表格内容,例如:我们修改了div容器的内部标签等等…

原因可能是我们破坏了第一次渲染的div容器的结构,

echarts的渲染逻辑是这样的:
如果未实例化则进行实例化过程,在此期间会在div容器生成一个 echarts_instance 属性, 该属性值其实就是当前echarts的ID,然后进行后边的渲染操作…

当我们刷新已经实例化的echarts图表时,echarts会先匹配改div容器上的_echarts_instance_属性值是否与实例对象的ID一样,如果一样则会在原有的结构上进行渲染,但是因为我破坏了原有的结构,所以无法重新渲染出表格内容,所以我们可以执行如下代码:

        var solvetime_chart = echarts.init(document.getElementById("solvetime_chart"));
        document.getElementById('solvetime_chart').setAttribute('_echarts_instance_', '')

这样div的_echarts_instance_值就不会被匹配到,这样echarts就会像渲染新的图标一样渲染出来

注:这样的操作会重新渲染echarts的div容器结构,也就是重新操作了dom,会影响性能

### Vue3 中通过多选框控制 ECharts 的显示与切换 在 Vue3 中实现通过多选框 (checkbox) 控制 ECharts 图表的显示与交互功能,可以通过监听多选框的状态变化来动态更新图表的数据或样式。以下是具体的实现方式: #### 实现逻辑说明 1. 使用 `ref` 或者 `reactive` 定义响应式的图表数据源。 2. 绑定多选框到一个数组变量上,该数组用于存储当前被勾选的选。 3. 当多选框状态发生变化时,触发事件处理函数重新设置图表配置并调用 `setOption` 方法图表。 #### 示例代码 以下是一个完整的示例,展示如何利用 Vue3 和 ECharts 来实现这一需求: ```javascript <template> <div class="app"> <!-- 多选框 --> <label v-for="(item, index) in options" :key="index"> <input type="checkbox" :value="item.value" v-model="selectedOptions"> {{ item.label }} </label> <!-- ECharts 图表容器 --> <div ref="chartRef" style="width: 600px; height: 400px;"></div> </div> </template> <script setup> import { ref, onMounted, watch } from 'vue'; import * as echarts from 'echarts'; // 数据定义 const chartRef = ref(null); const myChart = ref(null); const options = [ { label: '类别A', value: 'A' }, { label: '类别B', value: 'B' }, { label: '类别C', value: 'C' } ]; const selectedOptions = ref(['A']); // 默认选中的选 onMounted(() => { initChart(); }); watch(selectedOptions, () => { updateChart(); }); function initChart() { const chartDom = chartRef.value; if (!chartDom) return; myChart.value = echarts.init(chartDom); updateChart(); // 初始化完成后立即渲染一次图表 } function updateChart() { const dataMap = { A: ['苹果', 5], B: ['香蕉', 8], C: ['橙子', 7] }; const filteredData = Object.keys(dataMap).filter(key => selectedOptions.value.includes(key)) .map(key => dataMap[key]); const option = { tooltip: {}, xAxis: { type: 'category', data: filteredData.map(item => item[0]) }, yAxis: { type: 'value' }, series: [{ data: filteredData.map(item => item[1]), type: 'bar' // 设置为柱状图[^2] }] }; myChart.value.setOption(option); // 更新图表配置 } </script> <style scoped> .app { display: flex; flex-direction: column; align-items: center; } </style> ``` #### 关键点解析 - **多选框绑定**:使用 `v-model` 将多选框的状态同步至 `selectedOptions` 数组中。 - **动态过滤数据**:当多选框状态改变时,根据 `selectedOptions` 动态筛选出需要显示的数据。 - **ECharts 配置更新**:每次修改数据后都需要调用 `myChart.setOption()` 方法图表[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值