// TODO: 待补充代码
// 初始化图表的数据,设置周视图的初始数据
option.series[0].data = [180, 274, 253, 324, 277, 240, 332, 378, 101]; // 周数据(每周的总学习时长)
option.xAxis.data = ["2月第1周", "2月第2周", "2月第3周", "2月第4周", "3月第1周", "3月第2周", "3月第3周", "3月第4周", "3月第5周"]; // 周标签(每周的时间段)
myChart.setOption(option); // 将配置应用到图表,初始化为周视图
// 定义变量用于存储月视图的数据
let xMonthSeries; // 存储月份标签(如 ["2月", "3月"])
let yMonthSeries; // 存储每月的总学习时长(如 [总时长1, 总时长2])
// 定义一个求和函数,用于计算数组中所有元素的总和
function sum(arr) {
return arr.reduce((total, value) => total += value, 0); // 使用 reduce 方法对数组进行累加,初始值为 0
}
// 获取数据:从 data.json 文件中加载数据
axios.get('./data.json').then(({ data: { data } }) => {
console.log(data); // 打印从 data.json 中获取的数据,便于调试
// 提取月份标签(即对象的键,如 "2月"、"3月")
xMonthSeries = Object.keys(data); // 获取对象的所有键,形成月份标签数组
// 计算每个月的学习总时长
yMonthSeries = [
sum(Object.values(data)[0]), // 第一个月(如 "2月")的学习时长总和
sum(Object.values(data)[1]) // 第二个月(如 "3月")的学习时长总和
];
});
// 监听 Tab 切换事件:实现“周”和“月”视图的切换
let tabs = document.getElementsByClassName('tab'); // 获取所有的 tab 元素
for (let index = 0; index < tabs.length; index++) {
tabs[index].addEventListener('click', (e) => {
console.log(e.target.textContent); // 打印当前点击的 Tab 标签内容("周" 或 "月")
if (e.target.textContent === '月') {
// 如果点击的是“月”Tab,则切换为月视图
option.series[0].data = yMonthSeries; // 设置月视图的 y 轴数据(每月的总学习时长)
option.xAxis.data = xMonthSeries; // 设置月视图的 x 轴数据(月份标签)
myChart.setOption(option); // 应用新的配置到图表
} else if (e.target.textContent === '周') {
// 如果点击的是“周”Tab,则切换为周视图
option.series[0].data = [180, 274, 253, 324, 277, 240, 332, 378, 101]; // 恢复周视图的 y 轴数据
option.xAxis.data = ["2月第1周", "2月第2周", "2月第3周", "2月第4周", "3月第1周", "3月第2周", "3月第3周", "3月第4周", "3月第5周"]; // 恢复周视图的 x 轴数据
myChart.setOption(option); // 应用新的配置到图表
}
});
}
option.series[0].data
和 option.xAxis.data
:
series[0].data
表示 y 轴数据(如每周的学习时长)。xAxis.data
表示 x 轴数据(如每周的时间段)。xMonthSeries
和 yMonthSeries
:
xMonthSeries
是月份标签(如 ["2月", "3月"]
)。yMonthSeries
是每月的学习时长总和(通过 sum
函数计算得出)。sum(arr)
:
reduce
方法对数组中的所有元素进行累加。reduce
的回调函数接收两个参数:累积值 total
和当前值 value
。0
,确保即使数组为空,返回值也是 0
。axios.get('./data.json')
:
data.json
文件中加载数据。{ data: { data } }
是解构赋值,直接提取响应中的 data
部分。Object.keys(data)
获取对象的所有键,形成月份标签数组。Object.values(data)
获取对象的所有值(即每月的学习时长数组),并调用 sum
函数计算总和。document.getElementsByClassName('tab')
:
tab
元素(即“周”和“月”按钮)。addEventListener('click', ...)
:
tab
添加点击事件监听器。e.target.textContent
)判断是“周”还是“月”。option
的数据,并调用 myChart.setOption(option)
更新图表。
option.series[0].data = [180, 274, 253, 324, 277, 240, 332, 378, 101];
option.xAxis.data = ["2月第1周", "2月第2周", ..., "3月第5周"];
myChart.setOption(option);
option
是一个配置对象,用于设置图表的数据和样式。series[0].data
是图表的数值数据(如柱状图的高度)。xAxis.data
是图表的横轴标签(如时间周期)。myChart.setOption(option)
将这些配置应用到图表中,初始显示的是“周”维度的数据。let xMonthSeries;
let yMonthSeries;
function sum(arr) {
return arr.reduce((total, value) => total += value, 0);
}
xMonthSeries
和 yMonthSeries
是两个变量,分别用于存储“月”维度的横轴标签和纵轴数据。sum
函数用于计算数组中所有元素的总和(例如 [1, 2, 3]
的总和是 6
)。axios.get('./data.json').then(({ data: { data } }) => {
console.log(data);
xMonthSeries = Object.keys(data);
yMonthSeries = [
sum(Object.values(data)[0]),
sum(Object.values(data)[1])
];
});
axios.get
从文件 data.json
中获取数据。data.json
的内容如下: {
"2月": [180, 274, 253, 324],
"3月": [277, 240, 332, 378, 101]
}
Object.keys(data)
提取键(即月份),结果为 ["2月", "3月"]
,赋值给 xMonthSeries
。Object.values(data)
提取值(即每个月对应的数组),然后用 sum
函数计算每个数组的总和,结果为 [1031, 1328]
,赋值给 yMonthSeries
。let tabs = document.getElementsByClassName('tab');
for (let index = 0; index < tabs.length; index++) {
tabs[index].addEventListener('click', (e) => {
console.log(e.target.textContent);
if (e.target.textContent === '月') {
option.series[0].data = yMonthSeries;
option.xAxis.data = xMonthSeries;
myChart.setOption(option);
} else if (e.target.textContent === '周') {
option.series[0].data = [180, 274, 253, 324, 277, 240, 332, 378, 101];
option.xAxis.data = ["2月第1周", "2月第2周", ..., "3月第5周"];
myChart.setOption(option);
}
});
}
tabs
是页面上所有的 Tab 按钮(假设有两个按钮:一个是“月”,另一个是“周”)。e.target.textContent
)判断用户选择了“月”还是“周”:
xMonthSeries
和 yMonthSeries
)。myChart.setOption(option)
更新图表。这段代码的核心功能是通过切换“周”和“月”的视图来动态更新图表数据:
版本一文章的链接:蓝桥杯 web 学海无涯(echarts、axios)