--- tags: N108 Component --- # ExamContain.jsx - component 切換流程圖 - 可以配合 PPT 17頁 ```graphviz digraph Pageswitch { nodesep=0.8 Contain [color=orange, fontsize=22, shape=box,style=filled, fillcolor=Bisque] node [color=orange, fontsize=22, shape=box] edge [color=RosyBrown, style=dashed] Exam->{Contain Wrapper} Wrapper->{ProblemImg Choosebtn Issue} } ``` ## import 資料 | 名稱 | 類型 | 描述 | 來源 | | :------ | :----------- | :----------- | :----------- | | api | <font color='Green'>function</font> | API function | app/lib/api.js | | NavLink | <font color='RosyBrown'>external component</font> | Route | react-router-dom | | ReactLoading | <font color='RosyBrown'>external component</font> | loading component | react-loading | | back | <font color='Red'>image</font> | 返回圖示 | image/go-back-arrow.png | | back2 | <font color='Red'>image</font> | 返回圖示 2 | image/go-back-arrow2.png | ## constructor 介紹 ### state 參數介紹 | 名稱 | 類型 | 描述 | defalut | | :------ | :----------- | :----------- | :-- | | `data` | <font color='Gold'>json value</font> | API 傳回的資料| `[]` | | `pageNumber` | <font color='Salmon'>int</font> | 目前頁數| `1` | | `TotalPageNumber` | <font color='Salmon'>int</font> | 總頁數| `0` | | `isLoaded` | <font color='blue'>bool</font> | API loading,true 為 loading 完成,false 為正在 loading | `false` | | `hoverBack` | <font color='blue'>bool</font> | 返回圖示 hover 變化,true 為 hovering,false 為正在no hover | `false` | ## componentDidMount - 執行 get_api(),並將 isLoaded = true ## componentDidUpdate - 當 prevState == this.state 時,執行 get_api(),並將 isLoaded = true ## 獨立 function | 名稱 | 描述 | async 是否 | |:--|:--|:--| |get_api()|Call API,將資料存入 state|是| |subcolor()|`switch(subject)`去決定科目顏色|是| |gradecolor()|`switch(grade)`去決定年級(高一 ~ 高三)顏色|否| |produceList()|建立每份考卷的 Navlink **(不能用 map,因為不能遍歷,要依照目前頁數 `pageNumbe`去顯示 div)**|否| |SetPageNumber()|直接設定目前點選的 page number|否| |nextPageNumber()|下一頁|否| |backPageNumber()|上一頁|否| |pagination()|選頁數的 function,**(css 關係,因此不用 map)**|否| |hoverClick()|返回小圖示的 hover function|否| ### produceList() 介紹 - data (API 資料),pageNumber (目前頁數) - 每頁顯示 4 個考卷 - list 每個 index 的值都是考卷的 Navlink ➡️ [ExamWrapper.jsx](https://hackmd.io/JqzV6luhSsCA3CPCxtt_sg?view) ```jsx=78 produceList(data, pageNumber) { let list = [] let start = (pageNumber - 1) * 4 let end = start + 4 > data.length ? data.length : (start + 4) for (let i = start; i < end; i++) { list.push( <li key={data[i].CID}> <NavLink className="mouse examgo" to={`/Exam_wrapper?cid=${data[i].CID}`}> <div className="refschoolname dis-center2">{'1' + data[i].CName.split('1')[1]}</div> <span className="subjectname">{this.subcolor(data[i].sub)}{data[i].sub}</span> <span>{this.gradecolor(data[i].grade)}{data[i].grade}</span> </NavLink> </li> ) } return list } ``` ## API 數量表格 | 名稱 | 類型 | 描述 | 位於 | |:--|:--|:--|:--| |Exam/exam?type= + <font color='Blue'>selectData.type</font>|<font color='LightSkyBlue'>get</font>|藉由學校資料獲取每份考卷的詳細資料,包含:CID、CName、grade、ref、sub、type|get_api()| ## render ### props (上層傳入) 參數介紹 | 名稱 | 類型 | 描述 | | :------ | :----------- | :----------- | | `Close_select` | <font color='Green'>function</font> | 關閉選擇考卷模式| ### return #### 當 `isLoaded = false`,return - loading 畫面 (轉圈圈) ```jsx=134 return ( <div className="main_content dis-center overflow"> <div> <ReactLoading type={"spinningBubbles"} color="#000000" height={200} width={200} /> <h1 style={{ "marginTop": "8px" }}>Loading ...</h1> </div> </div> ) ``` #### 當 `isLoaded = true`,return - topbar沒做功能,只有 Html + Css - ![](https://i.imgur.com/QSR241K.png =65%x) ```jsx=157 <div className="dis-flex-row watch-search"> <div className="inline-block mouse" style={{ "marginRight": "10px" }} onClick={Close_select} onMouseOver={this.hoverClick} onMouseOut={this.hoverClick} > {hoverBack ? <img src={back2} alt="" width="32px" /> : <img src={back} alt="" width="32px" />} </div> <input type="search" placeholder="Find a Exam...." aria-label="Find a Exam...." className="search-input width-full"></input> <button name="button" type="button" className="btn2" style={{ "margin": "0px 8px" }}>科目&ensp;<span className="dropdown-caret"></span></button> <button name="button" type="button" className="btn2" style={{ "margin": "0px 8px" }}>年級&ensp;<span className="dropdown-caret"></span></button> </div> ``` - 建立每項考卷的點選 Navlink,完整介紹看上方 - 此處會跳轉到 ➡️ [ExamWrapper.jsx](https://hackmd.io/JqzV6luhSsCA3CPCxtt_sg?view) - ~~改map~~ - ![](https://i.imgur.com/JoTAbDJ.png =80%x) ```jsx=170 <ol className="gradient-list"> {this.produceList(data, pageNumber)} </ol> ``` - 頁數功能 - ![](https://i.imgur.com/TEG5vBl.png =125x) ```jsx=173 <div className="dis-center pagination-containter"> <ul className="pagination"> <li className="mouse"><div onClick={(e) => this.backPageNumber(pageNumber, 1)} >«</div></li> {this.pagination(TotalPageNumber, pageNumber)} <li className="mouse"><div onClick={(e) => this.nextPageNumber(pageNumber, TotalPageNumber)}>»</div></li> </ul> </div> ``` [回上層 Exam.jsx](https://hackmd.io/0K39dZY9Rbq7xwPFKNzDUw?view)