## React 思維進化 ## 2-4-2-6 ### (JSX/單向資料流/一律重繪) --- ### Jasmine - 非本科系轉職<font color='#96999A' size=6>(財金)</font> - 簡易UIUX專案經驗&後端資料庫開發經驗 - 資策會前端班<font color='#96999A' size=6>(112/12-113/6)</font> - 現從事React前端開發工作<font color='#96999A' size=6>(113/7~now)</font> --- ### 回顧 <font size=7 color='#CE0000'> React 不是直接「轉譯」成 HTML,<br/>而是管理 UI 的狀態工具</font> - <font size=6>JavaScript 直接操作 HTML 是靜態的,<br/>你必須手動修改 DOM。</font> - <font size=6>React 是透過「虛擬 DOM」來高效更新 UI,<br/>只有當狀態變更時,它才會更新對應真實DOM的部分。</font> --- # 2-4 ### JSX根本就不是在JS中寫HTML #### JSX=JavaScript XML --- #### JSX 是 React 的語法擴展,跟HTML沒有關係 #### 只是為了開法者好上手,所以故意長得跟HTML很像 --- ### JSX transformer --- > 轉換區域2-6會深入 > ![S__17334280](https://hackmd.io/_uploads/rkMKsZ1s1l.jpg) --- #### Old vs New JSX transformer --- ### Old JSX transformer ![S__17334277_0](https://hackmd.io/_uploads/SyvWrbkj1l.jpg) ![S__17334278_0](https://hackmd.io/_uploads/BkMzrbJjyx.jpg) --- ### New JSX transformer ![S__17334276_0](https://hackmd.io/_uploads/r1RNSbJiJx.jpg) --- #### Old vs New JSX transformer ![S__17334274_0](https://hackmd.io/_uploads/BJiSBWJskx.jpg) --- ### (補充說明)Compiler vs transpier ![image](https://hackmd.io/_uploads/HkvIZb1jkl.png) --- ### 2-4章節檢測 - <font size=6>JSX 語法的用途是什麼?其背後的本質為何?</font> - <font size=6>JSX 語法為什麼長得很像HTML語法?</font> - <font size=6>什麼是 transpiler?什麼是JSX transformer ?</font> - <font size=6>開發時撰寫的JSX語法是透過哪些流程處理,<br/>最後才能順利的在瀏覽器中執行並定義畫面的?</font> --- # 2-5 ### JSX語法規則&畫面渲染技巧 --- ### 語法規則 ![image](https://hackmd.io/_uploads/r15KxWki1g.png) --- #### JSX不同的<font color='#CE0000'>資料型別</font>執行對應的處理邏輯,<br/>最後將其轉換為可渲染的 DOM 結構 ![1740739829663](https://hackmd.io/_uploads/ByRbSz1jkl.jpg) --- ### 畫面渲染技巧 - 字面值 - 表達式 - 語法中表達另一段JSX語法作為子元素 - 條件式渲染 - 動態式渲染 --- ### JSX字面值 ![S__17342469](https://hackmd.io/_uploads/SJfhBQlj1x.jpg) ![S__17342469_0](https://hackmd.io/_uploads/HkvnHQljkl.jpg) --- ### JSX表達式 ![S__17342471_0](https://hackmd.io/_uploads/HkSB1M1oJg.jpg) --- #### JSX語法中表達另一段JSX語法作為子元素 ![S__17342472_0](https://hackmd.io/_uploads/rytDkzyjJl.jpg) --- #### 接受簡寫 ![S__17342474_0](https://hackmd.io/_uploads/r1FCMGkj1l.jpg) ![S__17342476_0](https://hackmd.io/_uploads/r1vemfkoJe.jpg) --- <font size=6> 在 JSX 中,<font color='##CE0000'>最外層只能有一個根節點,</font><br/>這是因為 JSX 會被 React.createElement 轉換,而 React.createElement 只接受單一根元素。<br/>如果要回傳多個元素,可以使用:</font> >- ``` <div></div> ```(增加一層標籤) >- ``` <Fragment></Fragment>```or ```<> </> ```(避免額外的 DOM 標籤) --- - <font size=5 color=' #97CBFF'>由於 JSX 中的每個內容(字面值,表達式...)都是獨立的子元素,<br/>是為了React 在比較新舊 Virtual DOM 時,<br/>能更精細地判斷哪些部分發生變化,<br/>進而最小化 DOM 更新範圍,提高效能。</font> --- ### (補充說明)&& 比較 ? : <font size=6>似乎大部分工程師不喜歡用<font color='#CE0000'>"&&"</font> ,<font color='#CE0000'>"? :"</font>較確保? ![image](https://hackmd.io/_uploads/rkye5lyo1g.png) --- ![IMG_9292](https://hackmd.io/_uploads/BkuxMZkjke.jpg) --- ![image](https://hackmd.io/_uploads/HkkGFl1s1x.png) ![image](https://hackmd.io/_uploads/B1VO5ekoyx.png) --- ### 2-5章節檢測 - <font size=6>JSX 語法與 HTML 語法有哪些不同之處?</font> - <font size=6>為什麼一段 JSX 語法的第一層只能有一個節點?</font> --- # 2-6 ### JSX/單向資料流/一律重繪 --- ### 單向資料流 ![S__17342493_0](https://hackmd.io/_uploads/rkpTzr1j1g.jpg) --- ### 獨立資料與畫面分離 ![S__17342491_0](https://hackmd.io/_uploads/SJSTMHkjJx.jpg) > 會有版本紀錄 --- ### 兩種純JS渲染策略 ![IMG_9388](https://hackmd.io/_uploads/Sk1OTVys1l.jpg) --- ### React一律重繪,跟純JS有甚麼不同? --- ### 初始React element #### Virtual DOM ![S__17342486](https://hackmd.io/_uploads/ryAsJHkokx.jpg) --- ### 更新的React element #### Virtual DOM 一律重繪 ![S__17342488](https://hackmd.io/_uploads/SylOlr1oyx.jpg) --- ### 比對兩者差異 ![S__17342489](https://hackmd.io/_uploads/rJT_lHksJl.jpg) --- ### 只針對差異點修改實際DOM element ![S__17342490](https://hackmd.io/_uploads/BkCgbHJikg.jpg) --- > commit階段useEffect() 或 componentDidUpdate() 之類的生命週期函式才會執行,fiber render& commitphase還會深入 > ![image](https://hackmd.io/_uploads/B1-w0XQjyx.png) --- ### 比較 <font color='#CE0000'>Vue</font> 單向資料流虛擬DOM管理方式 <font size=6>追蹤資料與模板的關係,這樣才能監聽到資料去更新畫面。</font> --- ### 2-6章節檢測 - <font size=6>單向資料流是什麼? - 實現單向資料流的常見渲染策略有哪些?其分別的優缺點是什麼? - React 為了維護單向資料流所採用的渲染策略為何?是怎麼解決該渲染策略的缺點的?</font> --- # 討論 Q&A --- # 感謝聆聽 --- # 3/18 導讀人 筆記工 >資料來源:<<React思維進化>>, chatgpt
{"description":"清單","contributors":"[{\"id\":\"65fbcc36-3a7e-4796-aa32-75a847c6277c\",\"add\":6498,\"del\":2225}]","title":"React 思維進化"}
    103 views