Alice's
notes

2021/07/21 Web front-end development

JavaScript

React

耶好開心~~雖然早上精神很不好,一直很想睡,但沒想到遇到練習題時,還是可以自己摸索出來,成功做出想要的成果了!真的非常開心!!

(觀摩老師寫法,還是覺得老師很厲害,寫得比我精簡很多!也很好理解的程式碼)

React 生命週期 - React 元件在使用上可分為三個階段

  • 元件被安裝時(Mount)
    • constructor()
    • getDerivedStateFromProps()
    • render()
    • componentDidMount() // 類似元件後製處理
  • 元件被更新時(Update)
    • getDerivedStateFromProps()
    • shouldComponentUpdate()
    • render()
    • cgetSnapshotBeforeUpdate()
    • componentDidUpdate()
  • 元件被移除時(Unmount)
    • componentWillUnmount()

生命週期 - Mount

  • constructor() // 只作用一次
  • getDerivedStateFromProps() - 最常使用的狀況是「用初始接收到的 props 」去設定第一次 render 時的 state 或是做其他的事情。(這裡不能用 this )

生命週期 - Unmount

  • componentWillUnmount是在元件被移除時所會呼叫一次的唯一生命週期函數
  • 移除新增的元素

生命週期 - Update

  • getDerivedStateFromProps( props, state )
    • 只要 re-render 此函式即被觸發,props 和 state 是更新過後的值
  • shouldComponentUpdate( nextProps, nextState )
    • 這個函數的功用像是守門員,用來做確認是不是真的要 update。這個函數要return一個布林值
    • 當函數回傳 false 時,元件就不會更新,也不會繼續執行接下來的 render() 以及剩下的 update 生命週期函數
    • 預設會回傳 true
    • this.props 和 this.state 是更新之前的,新的 props 和 state 在參數中以 nextProps 和 nextState 存在
  • getSnapshotBeforeUpdate( prevProps, prevProps )
    • 它的用途是讓你可以把更新前的最後一刻 DOM 的狀況紀錄下來,然後用 return 值傳參數到 componentDidUpdate 中
    • 所以如果沒有要傳東西給componentDidUpdate,就要回傳null
    • this.props和this.state是更新之後的,舊的props和state在參數中以prevState和prevProps存在
  • componentDidUpdate(prevProps, prevState, snapshot)
    • 這個函數被強烈建議把「更新後想做的事情」放在這裡,包括先前提過的fetch等。因為這個函數是唯一也是最後在DOM真的被更新後執行的週期函數
    • 在這邊this.props和this.state是更新之後的,舊的props和state在參數中以prevProps和prevProps存在,snapshot是getSnapshotBeforeUpdate(prevProps, prevProps)傳來的參數
    • 使用這個函數時有一個很重要的事情: 只要任何一個props/state被設定(assign),就會重新進入Update週期,導致此函數再次被執行

react-router-dom

  • 後端路由,從後端程式碼去監聽不同的url,決定該 response 哪個頁面
  • 前端路由,由網頁程式碼更改頁面不ㄧ樣的地方,所以只需一個路徑即可,稱為 Single Page Application(SPA)
  • 前端路由的套件:react-router-dom
  • HashRouter: 頁面路徑最前面會有 #,換url時不會發送request
  • BrowserRouter: 頁面路徑不會有#,換url時會發送request
  • 安裝 - npm i react-router-dom

HashRouter - 由上往下做匹配,匹配到就不會匹配後面的頁面。換頁面時,並不會有請求,不會有網路活動,也減少網路流量(SPA)。BrowserRouter 就是一般的路由,每次都會做請求。

url 的匹配是循序比對下來,只要部分匹配即可,所以將 /second 調到前面才可以顯示第二頁。

HashRouter 跟 BrowserRouter 一定要包在外面,加上 Switch 只會執行第一個符合的匹配,而不會匹配的全部渲染。

Summary

今天精神都不是很好 Q_Q,不過今天學的東西都很重要呢!不懂的部分還是要找時間去看文章閱讀,希望我不會多學了一個新的,都還沒很深入,就又去學了另一個了,之前學的東西也要好好深入的自學下去!(握拳)