答案:
// 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); // 應用新的配置到圖表}});
}
詳細注釋說明
1. 初始化圖表數據
option.series[0].data
?和?option.xAxis.data
:- 這是 ECharts 圖表的核心數據部分。
series[0].data
?表示 y 軸數據(如每周的學習時長)。xAxis.data
?表示 x 軸數據(如每周的時間段)。- 在這里,我們設置了初始的周視圖數據。
2. 定義變量
xMonthSeries
?和?yMonthSeries
:- 這兩個變量用于存儲月視圖的數據。
xMonthSeries
?是月份標簽(如?["2月", "3月"]
)。yMonthSeries
?是每月的學習時長總和(通過?sum
?函數計算得出)。
3. 求和函數
sum(arr)
:- 使用?
reduce
?方法對數組中的所有元素進行累加。 reduce
?的回調函數接收兩個參數:累積值?total
?和當前值?value
。- 初始值為?
0
,確保即使數組為空,返回值也是?0
。
- 使用?
4. 獲取數據
axios.get('./data.json')
:- 使用 Axios 發起 HTTP GET 請求,從?
data.json
?文件中加載數據。 { data: { data } }
?是解構賦值,直接提取響應中的?data
?部分。Object.keys(data)
?獲取對象的所有鍵,形成月份標簽數組。Object.values(data)
?獲取對象的所有值(即每月的學習時長數組),并調用?sum
?函數計算總和。
- 使用 Axios 發起 HTTP GET 請求,從?
5. 監聽 Tab 切換
document.getElementsByClassName('tab')
:- 獲取頁面中所有的?
tab
?元素(即“周”和“月”按鈕)。
- 獲取頁面中所有的?
addEventListener('click', ...)
:- 為每個?
tab
?添加點擊事件監聽器。 - 當用戶點擊某個 Tab 時,根據其內容(
e.target.textContent
)判斷是“周”還是“月”。 - 根據判斷結果,動態更新?
option
?的數據,并調用?myChart.setOption(option)
?更新圖表。
- 為每個?
1. 初始化圖表數據
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)
?將這些配置應用到圖表中,初始顯示的是“周”維度的數據。
2. 定義變量和函數
let xMonthSeries;
let yMonthSeries;function sum(arr) {return arr.reduce((total, value) => total += value, 0);
}
xMonthSeries
?和?yMonthSeries
?是兩個變量,分別用于存儲“月”維度的橫軸標簽和縱軸數據。sum
?函數用于計算數組中所有元素的總和(例如?[1, 2, 3]
?的總和是?6
)。
3. 獲取數據并處理
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
。
4. 監聽 Tabs 點擊事件
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 按鈕(假設有兩個按鈕:一個是“月”,另一個是“周”)。- 給每個 Tab 按鈕添加點擊事件監聽器,當用戶點擊時觸發回調函數。
- 回調函數根據點擊的按鈕內容(
e.target.textContent
)判斷用戶選擇了“月”還是“周”:- 如果選擇“月”,則更新圖表數據為“月”維度的數據(
xMonthSeries
?和?yMonthSeries
)。 - 如果選擇“周”,則更新圖表數據為“周”維度的原始數據。
- 如果選擇“月”,則更新圖表數據為“月”維度的數據(
- 最后調用?
myChart.setOption(option)
?更新圖表。
5. 總結
這段代碼的核心功能是通過切換“周”和“月”的視圖來動態更新圖表數據:
- 初始顯示“周”維度的數據。
- 當用戶點擊“月”按鈕時,顯示每個月的總和。
- 當用戶點擊“周”按鈕時,恢復顯示每周的原始數據。
版本一文章的鏈接:藍橋杯 web 學海無涯(echarts、axios)