組件語法與useState/useEffect

組件語法與基本生

React component (組件)語法

  • component 就像是 JavaScript 的 function

  • ReactDOM.render 中{函式名稱}變成了<函式名稱/> see:Render Elementarrow-up-right

  • Component 命名首字必須大寫,大寫駝峰的方式,否則 React 會把它當作一般的 HTML 元素處理,並跳出Warning提示,看到大寫駝峰命名變數時,可以知道是 React 組件而非一般函式。

  • 其他 HTML 屬性、CSS 樣式屬性或一般的函式來說,則會遵行 JavaScript 以小寫駝峰來命名變數的慣例,例如在 className、maxLength、backgroundColor 等等。

import ReactDOM from "react-dom";

const App = 函式; 

//JSX縮寫 直接用()
- // const App = () => (
- //     <div>256</div>
- // );
//JSX有變數時 改() => {}
+const App = () => {
+  const count = 256;
+  return (
+      <div>{count}</div>
  );
+};
ReactDOM.render(<App />, document.getElementById("root"));

props 是什麼

  • component 就像是 JavaScript 的 function,它接收任意的參數(稱之為「props」)並且回傳畫面的 React element。

  • props 通常是不可變的(唯獨Immutable),不能修改自己的

  • props 為子組件接受父組件的溝通管道,是唯獨的不可異動

Ref:[Components 與 Props] (https://zh-hant.reactjs.org/docs/components-and-props.htmlarrow-up-right)

function component [推薦寫法] vs class component

接著看看兩種寫法轉換 Function 成 Class :

使用 function 來做 component

  • 如果需要向component傳参数,可以使用 props 對象,

  • 用 return (html)

使用ES6 class來做 component

  • 也可以使用ES6 class 來 來定義

  • 繼承React.Component且在用render(){}包一層

  • props 要改用 this.props

  • 用render(){return html}

組件裡面可以再包組件,透過這樣可以重新利用 範例練習: USER infoarrow-up-right

React組件 ES6箭頭函式組件 寫法

接著看看箭頭函式語法可以簡潔,少打很多字元

  • const App= () => JSX.Element //大寫駱駝命名

  • 縮寫:如果裡面只有return 可以去掉{}與return,但通常會有一些變數存在,個人習慣保留.

  • 箭頭函式不可以使用於建構式,可以見[JS 01] javascript 新手上路與概念筆記arrow-up-right

  • 使用插件快速鍵 rafc - ReactArrowFunctionComponent


State的用法

Props 是唯讀的(Immutable),State 類似於 prop,但它是私有且由 component 完全控制的。當state被改變時,會進入re-render的update程序,更新畫面

  • state 為自身component 存放資料的地方,管理內部狀態

class(setState) vs function(useState) [推薦寫法]

1. 使用class來改state(setState)

2.使用function component更改state(用useState)

  • 沒有內部狀態(State),是 Stateless Components。

  • 沒有 Lifecycle Hooks 和 refs。

  • 如果想要更改props 要改用useState,useState-是一個基礎的Hook,是可以在function component中使用設定state,而不需要轉換成class。

hook意思是“鈎子”,在音樂上,指的是一首歌曲中最能鈎人的部分。Hook 是 React 16.8 增加的新功能。讓你不必寫 class 就能使用 state 以及其他 React 的功能。使用hook可以更簡化且被推崇使用。

  • useState它回傳了一對值:目前的 state 跟一個可以更新 state 的 function。useState 其實是React 物件中的一個方法,用法的兩個參數其實是解構賦植的用法


(延伸說明)hooks 與 Function Component

使用 State Hookarrow-up-right

  • 用 Function Component 代替 Stateless Component 的说法,原因是:自从 Hooks 出现,函数式组件功能在不断丰富,函数式组件不再需要强调其无状态特性,因此叫 Function Component 更为恰当。

  • 精读《Function VS Class 组件》arrow-up-right 中可以看的使用class component,會因為使用this問題而需要修復,要follow class結構與巢狀太過雜亂,再者,而function component沒有this,如果希望拿到稳定的 props,使用 Function Component 是更好的選擇。而

  • Function Component + Hooks 可以实现 Class Component 做不到的 capture props、capture value,而且 React 官方也推荐 新的代码使用 Hooks 编写

  • 不能在條件式(conditions)、迴圈(loops)或嵌套函式(nested functions)中呼叫 Hook 方法

triangle-exclamation

生命週期

元件被安裝時(Mount)、元件被更新時(Update)、元件被移除時(Unmount) *註:原本想要一樣比較一下class 原本的用法,但還是直接介紹function component(useEffect)更簡潔.

useEffect hook

Ref:

  • 官方-hooks-effectarrow-up-right 重點:

    • 內有使用class與hook 的範例對比說明

    • 很多待細讀 TBD

    • 我們建議使用 exhaustive-deps 規則作為我們 eslint-plugin-react-hooks package 的一部分。當不正確地指定依賴時,它會發出警告,並提出修改建議。


組件拆分

設計思考:拆分成獨立的元件外,現在,我們要根據使用者輸入的值不同來呈現不同的畫面

備註 做拆分後有出現devTools讀不到檔案出現異常 這時重開就可以了

範例:同檔案拆分

範例:props的傳遞 與解構賦值

  • `使用 <div> {element}</div>`

  • props 傳遞以下所見

範例:分檔案拆分

範例:分檔案拆分:儲存變數

範例:自己造cusomer hook

  • 把要給其他 React 組件使用的資料或方法回傳出去

  • 下面範例跟前述不同不是回傳<div> {element}</div>

網路參考範例:

React State(状态)arrow-up-right @runoob基礎與線上範例 State 和生命週期arrow-up-right @React中文React解說 【React.js入門 - 11】 開始進入class componentarrow-up-right @IT邦幫忙的系列文 React 與 bind this arrow-up-right@medium

React hookarrow-up-right @React 中文解說Hook系列 使用 State Hookarrow-up-right @React 中文解說State Hook中寫法對比

[Day 25 - 即時天氣] 自己的鉤子自己做 - 建立 Custom Hookarrow-up-right

Last updated