iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
0
Modern Web

先你一步的菜鳥 - 從 0 開始的前端網頁設計系列 第 8

Day-8 class vs function-component 基本架構(下)

  • 分享至 

  • xImage
  •  

今天這一篇接續著前篇,繼續來講解 function component。

function component 沒有 state、也沒有 constructor

說的過分一點,等於就是沒有大腦
https://ithelp.ithome.com.tw/upload/images/20200906/20123396f7AmIaHpun.jpg
所以它記不住任何事,除非 class component 交給它一張紙條要它照著念。

所以我們將 function component 定義在 class component 裡面,當作 class component 的子 component, 並將 class component 的 state 當作 props 傳給 function component。

註:如果不將父 component 傳過來的 state 和 props 做改變的話,該 component 會跳過 render 階段,此 component 將被視作 pure component,有助於提升效能。

註:props 是 component 參數的統稱,當然你可以自己定義參數的名字,後面會帶到。
這樣子就可以讓 class component 跟 function component 互相傳遞資訊了~

class ElderBrother extends Component {
  constructor(props) {…}

  handleChange= () => {…}
  render() {
    return (
      <div>
        <h1>我是 class</h1>
//---------------傳遞 props --------------------//
        <YoungerBrother paper={this.state.memory} />
//---------------------------------------------//
      </div>
    );
  }
}

props 除了可以傳遞 state 以外,也可以將自定義的 function 當作 props 傳給 function component 使用,所以我們將 function 和 state 往下傳試試看吧。

<YoungerBrother paper={this.state.memory} handleChange={this.handleChange}/>

剩下最後一步,我們把 function component 加上一些裝飾和定義 props,讓他能夠顯示從 class component 接到的 props。

//定義 props //
function YoungerBrother(props) {
//----------//
  return (
    <div>
      <h1>我是 function</h1>
// 用 onclick 觸發 function //
      <button onClick={props.handleChange}>chane</button>
//
// 顯示 props //
      <p>紙條 : {props.paper}</p>
//
    </div>
  );
}

註:因為這時 function component 可以通過 handleChange 改變 class component 的 state,所以已經不是 pure component。

function component 在 class component 的幫助下,也成為了一個有為青年,能夠順利的完成任務,可喜可賀。

然後運行 React ,畫面會長這樣。
https://ithelp.ithome.com.tw/upload/images/20200906/20123396eDINhXOS9Y.png

註:因為 function component 已經作為子 component 包在 class component 裡面了,所以也會顯示在畫面上。

按下 change 試試看
https://ithelp.ithome.com.tw/upload/images/20200906/20123396T4WpMXKd45.png
畫面也正確的顯示出來了。

這是因為 function component 接收了來自父 component 的 function,因此才可以影響到父 component 的 state,如果使用在 function component 內定義的 function 的話,state 將不會改變,有興趣的可以自己試試看喔。

完整的 function component 和 class component:

function YoungerBrother(props) {
  return (
    <div>
      <h1>我是 function</h1>
      <button onClick={props.handleChange}>change</button>
      <p>紙條 : {props.paper}</p>
    </div>
  );
}

class ElderBrother extends Component {
  constructor(props) {
    super(props);
    this.state = {
      memory: "infinity",
    };
  }
  handleChange= () => {
    this.setState({ memory: "i'm gooooood" });
  }
  render() {
    return (
      <div>
        <h1>我是 class</h1>
        <YoungerBrother paper={this.state.memory} handleChange={this.handleChange}/>
      </div>
    );
  }
}

今天介紹完了 component 的兩種型態 class 和 function 的用法和差別,也帶到了一些關於 props 的概念,這邊統整一下這兩天講的重點,和補充一些額外的東西。

  • function 沒有 state 和 constructor,不能儲存 props 。

  • props 是 component 參數的統稱,這邊列出幾種定義方式。
    你可以改成這樣

    function YoungerBrother({paper,handleChange}) {...}
    

    或這樣

    unction YoungerBrother(props) {
     const {handleChange,paper} =props
     return (...)
      }
    

    這樣就可以直接使用 {handleChange} 、{paper} 來顯示 props 傳來的資料。

  • 透過 props 可以傳遞純資料 ,也可以傳遞 function,經過 bable 編譯過後的 JSX 元件也可以。

  • 如果想改變父 component 的 state ,只能使用父 component 的 function。

  • arrow function 可以自動綁定 this 。

光是這樣看起來, class component 可以做到所有 function component 可以做的事。

但是一味的使用 class component 在後期會讓專案過於龐大,因為 stateful logic很難共享,就造成了多個 class component 為了擁有共用 state 的獨立性去改變自己的架構,很可能會造成過度包裝,更不用提散落在各個生命週期處理狀態的相關邏輯了,亂到炸掉,造成可讀性降低且難以維護。

這樣想想,好像 class component 並沒有想像中的那麼好,這些問題可以被解決嗎?

答案是有的,但在這之前我們必須先了解一下生命週期。

我是 Chris ,花有花開花落,年有春夏秋冬,明天將了解循環的浪漫。


上一篇
DAY-7 class vs function-component 基本架構(上)
下一篇
Day-9 循環的浪漫
系列文
先你一步的菜鳥 - 從 0 開始的前端網頁設計31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言