這次記錄兩份程式碼整合後的結果,這部分卡關了一天,感謝同學熱心與解惑,有釐清一下思維,來記錄一下過程。
需求
這次需要將清單與圖表整合在一起,如上方圖片所示,並且圖表與選單的內容要同步顯示。
程式碼整合
主要要整合的是下方兩個片段程式碼,相關說明可以參考這篇。
選擇清單
select 清單判斷條件與資料處理。
1 2 3 4 5 6 7 8 9 10
| function sortData(data, select) { if (select === "id") data.sort((x, y) => parseInt(x.id) - parseInt(y.id)); else if (select === "process") data.sort((x, y) => parseFloat(y.process) - parseFloat(x.process));
data.forEach((item) => { columns.push(parseFloat(item.process) / 100); category.push(item.name); }); }
|
C3.js 圖表
要匯入圖表的條件,參數會帶入 C3 中執行,C3 圖表程式碼略過不貼上來。
1 2 3 4 5 6 7 8 9 10
| let columns = ["完成率"]; let category = [];
function sortC3(data) { data.sort((x, y) => parseFloat(y.process) - parseFloat(x.process)); data.forEach((item) => { columns.push(parseFloat(item.process) / 100); category.push(item.name); }); }
|
整合前思考
誰是主要驅動的程式碼?
合併很單純的以為就是把兩個片段程式碼貼再一起,然後在 axios 裡面同步執行就可以了,可是兩者並無直接連動,所以要先決定哪一個才是主要驅動的程式碼,另一個只是跟隨其條件。
很直覺的操作是我要透過 select 選到想要的條件後,右邊圖表會跟著改變。
主要是 select 在控制
釐清 select 是主要的條件後,所以要把圖表整合到 select 裡面,兩者整合後就變成下方程式碼:
- 可見到中間區域的條件判斷使用的內容幾乎一樣。
- 所以只有把圖表要用的兩個變數拿過來用。
- 剩下的判斷與資料處理沿用清單的程式碼。
- 最後帶入 C3.js 圖表的函式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function sortData(data, select) { let columns = ["完成率"]; let category = [];
if (select === "id") data.sort((x, y) => parseInt(x.id) - parseInt(y.id)); else if (select === "process") data.sort((x, y) => parseFloat(y.process) - parseFloat(x.process));
data.forEach((item) => { columns.push(parseFloat(item.process) / 100); category.push(item.name); }); load(columns, category); }
|
最後就可以得到想要的結果了!
畫面處理
確認有資料有同步執行與顯示後,有牽扯到畫面就一定要提一下 CSS,這邊記錄一下重點。
HTML 架構
先看一下 HTML 架構,.wrap
是整個清單與圖表顯示的大區塊,當中又分成左右兩邊區塊,所以我要動的就是 .wrapLeft
跟 .wrapRight
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <main> <div class="main"> <div class="wrap"> <div class="wrapLeft"> <select class=" select"> <option value="id">依照 id 編號排序</option> <option value="process">依照完課率排序</option> </select> <div class="record"></div> </div> <div class="wrapRight"> <div id="chart"></div> </div> </div> </div> </main>
|
SCSS 樣式
要讓清單與圖表橫向排列,所以這邊要加上 display:flex;
1 2 3 4 5
| .wrap { width: 1200px; margin: 0 auto; display: flex; }
|
左右區塊只要加入百分比就會自動分開了。
1 2 3 4 5 6 7
| .wrapLeft { width: 40%; }
.wrapRight { width: 60%; }
|
CodePen https://codepen.io/hnzxewqw/pen/NWxeoBq
結語
對於程式碼整合思考還要再熟練一點,有時候想得太複雜了,要在直覺一點。