Apps Script用Sheet生成動態網頁(17): 認識React的hook
延續上一篇Apps Script用Sheet生成動態網頁(16): 認識React,我們接著要來認識React的hook機制。
我們在App.jsx中會看到useState(),這個由use開頭的函數,就是我們的hook,React在16.8.0版時加入Hook的支援。是為了functional元件所添加的功能,使得funcional元件不再只是寫寫固定內容的元件或是樣板,而是已具備一個完整的互動功能。
官方有提供一系列文件說明
- 介紹 Hook
https://zh-hant.reactjs.org/docs/hooks-intro.html - Hook 的規則
https://zh-hant.reactjs.org/docs/hooks-rules.html
除了useState()外,還有useEffect(),useContext(),useReducer(),useCallback()等等,這裡我們就只專注在範本中的hook。
範本中的Hook
我們在App.jsx中看到
const [showBtn, setShowBtn] = useState(true);
const [showUrl, setShowUrl] = useState();
由useState()的引用可知這是React提供的函數
import React, { useState } from 'react';
useState是用來儲存資料的,你可以給它一個參數作為初始值,就像useState(true)表示將資料初始成true;而它會回傳一個兩個元素的陣列,第一個元素是這個變數,而第二個元素是修改變數用的函數。我們透過解構賦值可以將元素命名成想要的變數。
const [showBtn, setShowBtn] = useState(true);
像是上面這個描述的意思就是可以用showBtn來存取資料,而setShowBtn則是用來改變資料用的函數,只要呼叫這個函數就會更新數值並改變畫面。
在App.jsx中可以看到我們在CSSTransition中有使用setShowBtn來設定值為true或false。
<CSSTransition
in={showUrl}
timeout={300}
classNames="alert"
unmountOnExit
onEnter={() => setShowBtn(false)}
onExited={() => setShowBtn(true)}
範例的互動流程
接下來說明一下整個範例的流程:
- 初始畫面
在一開始顯示App.jsx時,將showBtn初始化成true,表示按鈕元件會被顯示出來。
我們使用{showBtn && .... }做條件判斷,如果是falsy的(例如:undefined, null, '', false等),就不顯示;反之,就顯示Press Me按鈕。 - 當使用者按下Press Me按鈕
觸發事件onClick={getServerUrl}所註冊的getServerUrl函數。這個函數會去跟Google Apps Script伺服器取回目前伺服器的完整URL。 - 當完整的URL被取回來後
會呼叫.then(setShowUrl)所註冊的setShowUrl函數;反之,若發生任何錯誤則會呼叫.catch()所註冊的alert函數,使瀏覽器跳出預設的警示對話框。
而伺服器的getServerUrl會回覆一個URL,所以setShowUrl就會儲存資料,並更新畫面。 - 顯示URL訊息框
而CSSTransition因為有設定in={showUrl},所以只要showUrl不是falsy的,就會顯示子元素的內容;並且因為設定了onEnter={() => setShowBtn(false)},所以會把showBtn改成false,所以Press Me按鈕就會被隱藏了。 - 當使用者按下訊息框中的Close按鈕
因為有註冊onClick={() => setShowUrl('') 所以setShowUrl就會改變showUrl內容成'',並更新畫面。
而CSSTransition就因為showUrl為falsy而關閉顯示,這時onExited={() => setShowBtn(true)}註冊setShowBtn而將showBtn設為true,再度更新畫面。
因為showBtn為true,所以Press Me按鈕就再度顯示了出來。
留言