淺談 React & React Hooks

28 回覆
14 Like 3 Dislike
2018-12-05 14:46:38
原文: https://www.tecky.io/blog/到底react-hooks-有何特別

新近推出的React 16.7包括一個很有趣的功能,名字叫做React Hooks。看到這個名字,很多人會下意識認為是在講componentDidMount, componentDidUpdate等方法。但其實這些方法的正名是 React Lifecycle Method, 推出React Hooks是為了方便開發者多用functional component,但仍然能夠使用state及 props等重要功能。

React 簡介

如果你只對平常的 Web Programming 有認識,而未曾使用過React 的話,首先需要理解React的特別之處: 與 Dom Manipulation 不同,以 React 開發前端軟件要以 component作為基本單位去思考。以下是一個 React Component 的例子:

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}


對未曾接觸過 React 的朋友,以上一段代碼最令人奇怪的就是一段<h1>Hello, {props.name}</h1>。這個格式稱之為 JSX,就是容許開發者將 HTML 直接嵌入 Javascript 之中,簡化代碼的複雜程度。以上一段,就是將從 function 外傳遞的值成為參數,生成對應的HTML。

const elem = <Welcome name="Sara" />
ReactDOM.render(
  elem,
  document.getElementById('root')
)


以上這個例子,name 的值就是 Sara,elem 亦會是 <h1>Hello, Sara</h1> 的HTML。
就是運用了 React 裏面 props 的概念,props 是 properties 的簡稱,代表由外層component傳遞進來的值。

用 class 來建立 component

若然需要運用 React 另外一個重要概念 state,在 React Hooks 出現之前,我們只能使用 React 的 class component。以下是同一個 component,以 class 的型式重寫。

class Welcome extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    )
  }
}


使用 class 的一大好處,就是因為 this 的存在,我們可以使用 state 來儲存不同的值,再根據不同情況改變state。例如我們想為這個 Welcome 加一個 counter,每一次按 h1 就會加上 1 。Welcome 就會變成這個樣子。

class Welcome extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      counter: 0
    }
    this.incrementCounter = this.incrementCounter.bind(this);
  }
  incrementCounter() {
    this.setState(state => ({
      counter: state.counter + 1
    }))
  }
  render() {
    return (
      <h1 onClick={this.incrementCounter}>Hello, {this.props.name} {this.state.counter} times</h1>
    )
  }
}


加上React基本的設置,我們可以得到以下這個簡單的網站:



React Hooks

本來,React 的 component 用法就只有這兩大類,但是相信大家感受到使用 functional component 簡單得多,無需額外的一個 class,只要普通一個 function 就已經解決了。

問題是 Javascript 的 function 不支援 this,所以也無法儲存任何 state

因此,React的開發者加入了兩個非常有用的 built-in functions,一個叫 useState,一個叫 useEffect

useState 幫助開發者讀取及寫入 state,簡化的正是以上 setState 的一段代碼。
useEffect 幫助開發者簡化例如 componentDidUpdate 等的 logic。

以下是一個使用了 useState 重寫的例子。

function Welcome(props) {
  const [counter, setCounter] = useState(0);
  return <h1 onClick={() => setCounter(counter => counter + 1)}>
    Hello, {props.name}
    {counter} timers
  </h1>;
}


[counter,setCounter] 前面的是 counter 的 state,後面的是更新 counter 的 function。
因為我們的 counter 本身是基於之前的 counter 去更新,所以可以直接傳遞一個 function 像 counter => counter + 1 去更新 counter 的數值。

至於 useState(0) 的 0 就是 counter 的初始數值。

總結

加入 React Hooks,簡化了開發 stateful react component 的難度, useEffect 亦可有效分享 stateful logic ,不過今次篇幅有限,暫時先介紹 useState 吧。

__________________________________________________________

文章出處簡介:

Tecky Academy
三位熱心教學的開發者所創辦的成年人 programming 學校,唔係教 STEM,唔係求其教下網站,全部打真章!
高抬各巴絲貴手 like/follow 我地嘅 Facebook: http://bit.ly/2BPcSmB
有咩問題可以 tg 小弟: https://t.me/itdogltd
2018-12-05 15:36:30
2018-12-05 15:36:59
react不了
2018-12-05 15:38:15
師兄玩開咩 framework
2018-12-05 15:40:37
2018, vue la
2018-12-05 15:46:30
暫時都未知邊個贏

Vue.js 嘅配套例如 static site generator 同埋 native mobile (雖然有 flutter) 都未夠 react 完善

甚至有可能最後係 Streaming WebAssembly + Native Code 喺 web 係主流都未定!
2018-12-05 15:52:48
Es6 唔係鼓勵大家用class 咩?點解又想轉番做functional

想問下樓主點比較vue 同react? 我好撚鐘意Vue既syntax 寫少好多boilerplates, 但internally 其實有無咩大分別in terms of performance, maintainability之類?

高汁post 好鐘意frontend development
2018-12-05 15:54:47
小狗兄呢段時間PO react / react native, 唔知係咪因為睇左對家今日既flutter 1.0版呢
2018-12-05 15:57:44
唔關事 16.7 都係上兩星期推出

Flutter 正啊 遲啲話唔定我都轉會去 Flutter
2018-12-05 15:57:48
ES6 鼓勵大家寫CLASS, 但都容許你寫functional programming, 如果玩得多JS, 會發覺自己愈來愈唔中意寫咁多字, 你可以用短d 既code 做完既野, 而自己又熟的話, 通常都會揀寫少d

class Test{
    constructor () {
       //.....
    }
}

const Test = () => {

}; 
2018-12-05 16:01:24
個人麻麻地 Vue.js

始終係 large-scale application 黎講,Vue.js 做唔到嗰個 maintainability ,好多野係 string literal,我多數會配合 typescript + react 去做
而我用得 frontend JS framework,本身就係為左 scalability 同 maintainability,咁我梗係用一個好 main 啲架喇

而 boilerplates 方面,家陣 React Hooks 正正係想解決呢個問題
2018-12-05 16:02:03
但轉之前要睇下個需求, 有兩個地方我覺得要留意

1. Google map plugin仲未完善, 見佢依家仲未寫哂
https://github.com/flutter/plugins/tree/master/packages/google_maps_flutter

2. Webview 官方plugin, 最新先岩岩開發inline view, 都係未好多人用
[url]https://github.com/flutter/plugins/tree/master/packages/webview_flutter
[/url]

其他野我覺得唔掂太多native api, 我覺得flutter you can go on now
2018-12-05 16:06:59
情況其實同 React Native 差唔多,唔掂 Native 野,絕對好用
2018-12-05 16:16:15
React 不如講下Context API
2018-12-05 16:19:14
學野lm
2018-12-05 16:20:13
儲低下次寫
2018-12-05 16:48:57
留名學野
2018-12-05 16:54:18
關於flutter 我講多少少 今日1.0左 建議可以睇下條recap片
https://www.youtube.com/watch?v=D-o4BqJxmJE

其次就係感覺flutter 想做到更徹底....連desktop + browser 都諗住一套source code行哂 都幾痴線
2018-12-05 17:43:00
React Native 都可以用 React Native Web 同 React Native Desktop
不過 Flutter 用 WebAssembly 呢個 approach 做,更加 modern 係好事
2018-12-05 21:29:03
睇完 React Conf 2018 講React hooks, 好似幾正
https://www.youtube.com/embed/dpw9EHDh2bM?start=685

官網 Introducing Hooks
https://reactjs.org/docs/hooks-intro.html
2018-12-05 21:32:48
c#同java寫網頁有咩分別
2018-12-05 21:39:27
用緊vuejs
2018-12-07 19:32:09
其實篇野係比咩程度嘅人睇

前半簡介class嗰啲都係啲基本入門野,識嘅基本上可以唔駛睇,唔識嘅只會睇到亂(e.g. class, this)
反而react hook嗰part如果可以詳細少少就好
例如俾下real life example,講下performance上面嘅分别或者有冇咩cons仲好
2018-12-08 00:48:57
講得啱
識React嘅人, 睇編文講嘅野本身都應該識, 入嚟只係周樓主有冇講錯;
唔識嘅, 連個底都未打好, 睇完都唔會明樓主講咩。
吹水台自選台熱 門最 新手機台時事台政事台World體育台娛樂台動漫台Apps台遊戲台影視台講故台健康台感情台家庭台潮流台美容台上班台財經台房屋台飲食台旅遊台學術台校園台汽車台音樂台創意台硬件台電器台攝影台玩具台寵物台軟件台活動台電訊台直播台站務台黑 洞