2021年7月15日 星期四

練習作文:SSR 原理,以 Next.js 為例

 最近面試蠻容易遇到,大家都用框架也沒可能自己費工刻一個,因此練好作文說得一口好 SSR(Server Side Rendering) 還是需要練習一下。

一開始用 HTML 寫網頁的模式就是 CSR(Client Side Rendering),在 Client 端開始解析 JS,建立 DOM,隨著頁面漸漸著重於 JS,以及前端框架興起的 SPA (Single Page Application),提供了利用 Router 迅速切換頁面的優良體驗,但是這樣的模式帶來了幾個缺點,第一個是整包的 JS 載入十分花費效能,第二是一整包的 JS 爬蟲無法解析出 HTML 內容,不利 SEO,因此 React 發展出 Next , Vue 發展出 Nuxt ,SSR 架構 Server Side 會回傳整個 HTML,並且在各個頁面重新呼叫 Request,避免初次載入整包 JS 造成效能問題,在一個產品的越後期要改成成 SSR 架構就越艱難,因此最好是早期就訂好 SEO 需求,決定架構是否採用 SSR 。



參考資料:Next文件









2021年7月11日 星期日

Vue 與 React 生命週期比較

以 Vue 3 與 React 做比較

建立實體:

Vue:

const vm = Vue.createApp({

data(){

return{

name:'Jeff'

}

}

})

vm.mount('#app')

React:

ReactDOM.render(

  <h1>Hello, world!</h1>,

  document.getElementById('root')

);

初始化:
Vue:
setup()

React:
componentDidMount()

React 會 render 畫面兩次,並只顯示後一次 render 出來的結果,起始資料可以再這邊 call API。

更新畫面:
Vue:
onUpdated()

React:

componentDidUpdate()


React 的首次 render 不會觸發 DidUpdate

結束:
Vue:
onUnmounted()

React:
componentWillUnmount()

React 16.8之後狀態管理改用 Hook ,具有比生命週期更為直覺且省去複雜的 this,轉向 function component 為主的建置。



參考資料:

Vue

React

2021年7月8日 星期四

leetCode Missing Number

 最近因為面試解了不少前測,爬文章的時候看到這題有蠻多想法的, leetCode 會計算花費的運算時間覺得有趣,就研究了一下。

題目是 0~N 的整數陣列,中間缺了哪一個數?

一開始想到用排好再計算差值的方法

 const array = [301];
 const missnumber = nums => {
        array
          .sort((a, b) => a - b)
          .map((item, index) => item - array[index - 1])
          .find(item => item > 1);
        return missnumber;
      };
missnumber(array)

覺得有點多行,感覺應該有什麼很酷的方法不用反覆對陣列操作,就找了一下,發現可以用XOR 運算。

原理是 a ^ b ^ c ^ a ^ b = a ^ a ^ b ^ b ^ c = 0 ^ 0 ^ c = c

 const array = [301];
 const missNumber = nums => {
        const nArray = [];
        for (let i = 0; i < nums.length + 1; i++) {
          nArray.push(i);
        }
        const mathArray = nums.concat(nArray);
        const outputNumber = mathArray.reduce((total, e) => total ^ e);
        return outputNumber;
      };
 missNumber(array);

於是改了一種寫法,就程式的行數而言下面比較長,效能而言由於我家網路莫名其妙,兩者互有快慢比不出來,未來要仔細研究一下時間複雜度的計算。

參考資料:https://www.ruanyifeng.com/blog/2021/01/_xor.html










2021年7月2日 星期五

Fisher-Yates Shuffle 亂數排序演算法

被問到亂數排序的問題,之前都只是會用 Math.random() ,用陣列方法排一排之類的,沒在認真思考最有效率的排法。
有一個很瀟灑的寫法:

     array.sort((a, b) => Math.random() - 0.5);

可惜經過實測,不知為何會有機率分配不均的問題,因此才往下看 Fisher-Yates Shuffle。
原理是將陣列由後往前每次與前方隨機一個元素交換位置,這樣實測結果會是差不多的,沒看過也不太容易想出合理的解,或變得要用小樣本去執行幾萬次做測試,平常不太容易會接觸到,紀錄一下。


 const fisherYatesShuffle = array => {
        for (let i = array.length - 1; i > 0; i--) {
          let x = Math.floor(Math.random() * [i + 1]);
          [array[i], array[x]] = [array[x], array[i]];
        }
      };



參考資料:

[筆記] 如何正確實作 JavaScript Array Random Shuffle 亂數排序演算法

2021年7月1日 星期四

更新 Promise 的範例

 最近接觸到不少 Promise 操作,早期抄的一些範例也已經不合時宜不易讀,因此重寫一下理解。

創造一個 Promise 物件:

new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log("a"), resolve("a");
          }, Math.floor(Math.random() * 5* 1000);
        });

用 setTimeout 做出時間差,模擬真正 API 回來時間差的情境;

Promise 物件有三種狀態:pending(等待),fulfilled(已完成),rejected(已失敗);

Promise 物件有 resolve 與 reject 兩種回傳,resolve 是成功,reject 是失敗;

當串聯操作的時候,有幾種情況要考慮:需不需要照順序執行?需不需要依序得到結果?

先創造範例 a,b,c 三個 function

  const a = () => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log("a"), resolve("a");
          }, Math.floor(Math.random() * 5* 1000);
        });
      };
      const b = () => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log("b"), resolve("b");
          }, Math.floor(Math.random() * 5* 1000);
        });
      };
      const c = () => {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            console.log("c"), resolve("c");
          }, Math.floor(Math.random() * 5* 1000);
        });
      };

照順序執行:

console.log(a().then(b()).then(c()))

直接用 .then 或 .catch 可以按順序執行。不過 return 的順序則不一定。

依序得到結果:

  const enter = async () => {
        const cc = await c();
        const bb = await b();
        const aa = await a();
      };
      console.log("c->b->a"enter());

透過 ES6 async await ,使每個 Promise 得到結果才執行下一個,由於這樣一串時間會拖很長,務必將 function 與主要組件拆開,避免主要畫面轉圈圈轉不完。

整個都綁在一起不怕一個錯就全都跳錯,或是針對裡面的 Promise 物件錯誤有調整 resolve 的話,也可以用 Promise.all 來進行處理。

這個範例應該複製貼上都跑得了,也可以觀察 return 的順序,如有錯誤還請不吝指教。


2021年6月26日 星期六

讀 Vue3 Composition API 筆記 1

 一個用來處理組件共用狀態與邏輯的功能,是前端在工作時必備的,例如登入後要把登入狀態跟一些環境變數給予大部分的組件,或開發新的功能要在多個平行組件上運作,如果一層一層傳遞一是麻煩,二是要改 Code 追蹤的時候很痛苦,在 React 是使用 Context 或 Redux ,Vue 是 Vuex,原理都是創建一個 Store ,Store 儲存 State 與 Dispatch,例如登入與否,State:{ isLogin: false },Dispatch 就會是一個更新 State 的 function,如 dispatch({ type:isLogin , data:true}),再透過 reducer 去更新 State 使狀態發生改變,意義在於使共用狀態與邏輯是可追蹤的,方便知道哪些組件會更改,以及除錯會比較方便。

在 Vue 3 中,綁定需要加上 ref ,例如: const isLogin = ref ( false ) ,因為原始型別與物件型別在傳值與傳參考的反應不同。Vue 2 升級 Vue 3 時,生命週期可以由 vue import,mount 改成 onMounted,watch(觀察對象, callback , option),剩下的下集再續。

setup () {

   const isLogin = ref ( false )

   onMounted(()=>{

     dispatch()

})

}


參考資料:

Vue3文件 

Kuro 在大神來六角的解說

2021年6月20日 星期日

React 實作第三方登入:Google

     前陣子因為工作串接 Google reCAPTCHA Enterprise ,為了測試有辦了 Google 的雲端服務,現在買東西登入也懶得打一堆有得沒得,相當欣賞這種一個按鈕就解決的登入方式,所以來實作看看。

首先看文件引入 <script src="https://accounts.google.com/gsi/client" async defer></script> 

在 Next.js 用 GCP 相關服務都有點麻煩,剛好看到有套件就用了

npm install react-google-login 

再來設定 GCP OAuth 相關

在 GCP 左邊 API 與服務 選擇 OAuth 同意畫面進行設置,測試時記得加上 localhost ,上正式或測試環境時也要加上 domain。

API 與服務 > 憑證 建立憑證,建立OAuth 用戶端 ID,授權的 JavaScript 來源也要加上包含 localhost 等 domain ,重新導向 URI 是登入成功之後會導轉的頁面,然後可以把 JSON 下載下來可以看到 client_id ,需要設置在登入登出按鈕的組件上。

最後就運用 Next.js 完成設定與部屬。




取得的個資會在 profileObj 裡,進行 Hook 設置跟登入導轉(也可以直接寫在 GCP 的重新導向URI)


其他有練習使用 Tailwind CSS 建立 Context 部屬 Vercel。

Github: https://github.com/oneraner/react 原始碼

Vercel: https://react-delta-bay.vercel.app/ Demo位置



參考資料: 






2021年6月9日 星期三

非同步處理 async await array

 故事是這樣的,有很多小錢包需要分別打 API 去取得餘額,GraphQL API 本身是非同步的,可是當我要加總所有錢包的餘額就會:

const total = async () => {

const walletList = [ a , b , c , d , e]

let total = 0

await walletList.forEach( async  (item,index) => {

    const cash = await getCashApi(item)

     total = total += cash

     console.log(index)

})

console.log(total)

}

然後 index 亂跳 total = 0,完全沒用。


原因是 await 只看後面回傳的是不是 Promise ,但在改寫之前還要釐清是否有順序問題,如果要照順序,就用 reduce 的方法寫,不過我只要算加總,錢包 API 的錢回來的順序不重要,因此可以用 Promise.all 改寫:

const total = async () => {

const walletList = [ a , b , c , d , e]

let total = 0

await Promise.all(walletList.map( async  (item,index) => {

    const cash = await getCashApi(item)

    const outputCash = cash === undefined ?  0  :  cash   //後來發現 API 會回傳 undefined 導致加不起來

     total = total += outputCash

     console.log(index)

}))

console.log(total)

}

這樣就會出來正確的 total 啦



參考資料:







2021年3月28日 星期日

六角活動:就職三個月以來的開發過程

目前公司使用的技術及工具

React、Next.js、GraphQL、Gitlab、AWS、TypeScript、Styled Components、Trello、Jenkins...等等,還有一些 CI/CD 相關的東西我碰不到。

目前就職剛滿三個月,這篇文章寫完就過了三個月試用期,但是我真的是六角的學生,所以這時候要推薦大神來六角!隨著找到工作之後,接觸越來越多不同的技術,發現大神來六角都找的到基礎教學,可以延伸再去找講師的文章或社群尋找學習資源,剛錄取的時候覺得挑戰很大,公司的技術跟在六角學的 Vue、RESTful API、SCSS 完全不一樣,不過轉念想想公司都不怕了,我有什麼好怕的。

環境建置

剛進公司就是把 VSCode 與套件裝一裝,比較重要的大概是 TSLint 與 Prettier 和 Docker ,主要溝通或問問題是直接走過去說,要留記錄或 OnCall、訂便當就是不同 Line 群,公司提供工作用 Mac 跟螢幕,還有 VPN ,排 OnCall 跟加班要用。

開發流程

目前在支援另一個部門,公司有兩個會需要前端的部門,專案都是 React + Next.js + TypeScript 的主架構,只是 CSS 是 StyleComponent 或 CMS 上傳原生 CSS 的差別,還有 React 版本導致一個可以盡量寫 Hook,作到結構與樣式分離,一個只能用 Class 的 this.State 和 setState。

整體的流程大概是:從 PM 收到需求,通常會連帶跟技術主管一起說或是由技術主管轉達,大概有修改已有資訊、加新功能、改樣式,偶爾會有哪裡顯示有問題需要檢查的時候,討論完要怎麼實作之後開始動手,一開始會弄不清楚檔案在哪裡?桌機、手機有沒有分開?資料呈現的時候有沒有經過什麼計算或處理?作好了以後先單機測試,然後提 PR ,在 Trello 登記,推測試環境自己再看過一遍,然後通知 PM 跟 QA。

注意事項

第一次當前端工程師,一開始作過各種蠢事:

  • 提完 PR 沒問推測試環境的指令
  • 練習 Git merge 到 master 
  • 改了桌機板,結果手機也有一個相同的頁面沒改到...
  • 比例導致畫面黑邊的問題不知道應該用 padding 比例處理,沒有及時求助跟處理
  • 為了檢查畫面需要假資料或是有資料的測試帳號,需要自己做假資料或是測試環境跟正式環境的資料不一樣需要確認
通常只要兩個部門的兩位前端主管沒有全部請假,有人可以問技術問題的話產出還蠻穩定的,通常有 deadline 或上線、demo...等關鍵字就是加班趕完,這三個月加了三天,產品要上線就是立 flag 的概念,總是會出錯要解決。

工作心得


由於公司是在台北內科需要低調的公司,因此專案內容的部分不方便分享,進公司之後是先練習了用 React 實做組件以及做 Unit Test,React 的 Class 生命週期跟 Funtion Component,然後練習接公司的 GraphQL API ,Git 跟 Mac 的使用,我平常有在打 LOL 所以一直都用 windows 開發,Mac 是連觸控板都不會用那種,要從申請 Apple 帳號開始學。

Git 跟六角 Git 直播班還是有差距,情境還是差別比較大,後來自己寫筆記記錄自己使用 Git 的方法,同事比較習慣用終端機打,我是會混合用 SourceTree 辨認現在分支跟曾經修改的版本,或是不小心 commit 到一些在本機修改的設定、假資料,要 revert 的時候;或是從遠端 pull 最新的master,主要遠端分支設定:把 origin 設定成自己帳號的遠端分支,upstream 設定成公司帳號的遠端分支,提 PR 與更新 PR 就用 terminal ,因為會跑 TSLint,可以避免一些預期外的錯誤。

最近作了自己刻完整的頁面跟一些隨著變數改UI、搜尋、串接 iframe ...等等功能,可以做出實用、滿足需求的東西通過測試上線,蠻有成就感的,即使之前開發功能呈現的方法或樣式要討論很久,設計稿只有數張 Line 貼圖或 pptx 簡報,要自己用取色工具取色,對齊的格線也不知道怎麼對,需要通靈自訂格式。

最近寫 CSS,才學會用 var(--xx-xx: #fff) 的變數用法,之前看過 Taliwindcss ,可惜沒辦法通通改寫成變數形式達成一致性,有空作自己的 SideProject 會很想找機會研究跟實作 Taliwindcss 風格,改完一些 UI 細節後,發現完全沒有動到 Code 的部分,代表樣式跟結構有完全分開,也覺得蠻開心的,我跟洧杰老師一樣有色弱,所以什麼我(PM或同事)覺得怪怪的...這種敘述只能看有沒有前人寫的調色工具,或是把 Code 開好直接去 PM 旁邊改。

公司有蠻多下午茶與聚餐時間,薪水也比我當初開的高,希望這幾年隨著自己的進步,可以幫助自己也幫助公司成長,一起賺錢。

活動用連結:六角學院

2021年3月13日 星期六

2020 年底 Junior Frontend engineer 面試記錄暨求職心得

轉職動機:

    在 104 投了大約 30 家履歷,cakeresume 4 家,得到面試機會 5 次。筆者背景是 2019 年底

開始積極準備轉職,原本是象棋教師,觸動我轉行的動機是每個行業的薪資上下限就在那,

結構性問題也不是個人可以改變的,於是選擇六角學院作為主要的學習管道開始學習前端,

理由是對於學習路線描述的很清楚:連結,前端一方面比後端好上手,一方面是作出來的成果

直接在畫面上回饋感強,再來搜尋各家工程師從業心得,大概都是需要不斷學習,剛好我就是

喜歡學習研究的人,於是就入了這個坑。


學習時間及過程:

    配合活動的六角工商,介紹一下六角的學習歷程:在六角有買 jQuery、JavaScript、Vue...

等等,但是後來出的切版直播班跟 Vue 作品直播班比較有衝刺的效果,學習時間的話,在直播

班寫作業的時候,全職的時候就趁半夜沒聲音的時候狂寫,平均八小時,兼職的時候就比較

規劃平均只有兩個小時。最後把作品直播班作品作出來之後,精實修改了 300 條左右程式跟

設計上的建議,配著加碼的履歷健檢跟模擬面試,還有自己趁機寫的一些 F2E、Chart.js 小作品

就開始求職了。

    時間大約從六角最後一次改作業然後模擬面試完,2020/10月底到2020/12月底拿到 offer letter

 為止。職缺都是前端,Vue 或 React 都投,薪資條件都開 4 萬。


面試紀錄:


科技公司A:

    在 cakeresume 上投履歷得到回應。


    作寶寶攝影機,連 APP,母嬰分房照顧之類的時候很方便,覺得我有小孩就會買的一個

產品,第一關電話面試,自我介紹、介紹作品,由於這家是最早面試的,所以履歷上只有六角

的主要作品,作了一些技術問答後,問公司對工程師的配置,前端只有一個人,大部分都是

 APP 或後端,公司直接表明不適合,給了一段發問閒聊時間。


    其中一個建議:作品介紹的時候可以從主題如何發想開始,在我後來的面試中也有很大的

幫助。


準備的對公司問題:

    主管已說明主要負責 Vue 的一些工具 component 跟網站前端。

    前端團隊的配置?1前端,其他都是 APP 或後端。


健身公司A:

    caseresume 投履歷得到回應。

考卷回應後無聲卡。題目主要是 LeetCode 。


博弈公司A:

    104 上公司主動邀約面試。


    遊戲開發部主管、前端主管、資深工程師三人面試,最後HR問常見的面試問題,12/1面試、

預計12月底回復,結果無聲卡。


面試內容:

    自我介紹、ES6 var let const 差異、箭頭函式、.map、怎麼把陣列中重複的東西去掉,有些

忘了。工程師有看過作品,詢問購物車作法,使用 API 或 localstroge 儲存資料的差異,有教我

一般是用 localstroge 儲存購物車資料,最後才 post API。

六角的學習經歷跟製作作品時間,git  commit 怎麼忽略檔案。


準備對公司的問題:

    公司做什麼的?博弈(從在內湖主動邀約大概可以猜測)。

    團隊組織的組成?公司使用的框架?組織:遊戲開發部,兩個各四人的前端 team、以 React 

框架為主。

    哪些地方可以進步?實做作品數量、團隊溝通經驗。


11月中到12月中,中間花了一個星期多邊投邊補了幾個自己作的東西,一方面作自我研究,104 的職缺比較多所以後來都主投 104 為主。

   

接案公司A:   

    104 上投履歷,第二天收到電話聯絡。

    面試過程首先人資,再來業務經理。

    事前有說看作品,所以先接網路把 github pages 弄出來,介紹作品,問轉職的原因,談到公司

有外派或自身開發需求前端,期望薪資開4萬,104上寫5萬~6萬,不過我沒刻意開高,然後找

經理來。再介紹一次作品,經理有想看後台、旅館預約服務、將新研究的 Chart 作小修改。

我後台有顏色跑掉的問題,因為沒在顧畫面,做完自製產品就沒再開跟檢查了,如果要投會做

後台的公司要注意一下,Chart 的圖表製作來源,因為沒 API ,就用 JSON Server 玩看看,結果

差點改到壞掉,好險只是因為 VSCode 開過別的資料夾,JSON Server 要重開。


    公司想作新產品從 0 開始,會用腦力激盪的方式開會討論,產品開發的週期會比一般接案

開發更長,會有加班時間,前期自我研究會比較多,有資深工程師但應該靠自己研究比較多,

表單處理會比較多,有提到缺開給 Junior 是為了研究熱情(加班需求)?

    預計 12 月中有回應,結果無聲卡。


現職公司:


    104 上公司主動邀約面試,一開始傻眼履歷上都是 Vue ,職缺寫 React 工程師,不過抱著當

練習順便試試自己的功力就去了。


  三階段:考試、人資、技術主管

筆試:30分鐘技術問題 10分鐘DISC。應該30分鐘就全寫完了,忘了問能不能 google 就先不用

手機。


考題:

1. for(var i = 0; i < 5; i++){
           settimeout(()=>{console.log(i),1000}
     )} 為什麼出現5次i都相同?怎麼解決?

    考同步觀念。


2. 傳址問題  a = {}  b= {}  c=a  a ===b  a===c true or false?

    考物件傳址。


3.從1-n 之間產生不重覆隨機數生成一個新陣列(邏輯)

    這題最不會,討論最久,應該要用我忘了的 while 迴圈。


4.很多層的元件應該如何傳值?

    剛好有研究平行組件傳值,就用 Vuex 答,對應 react 應該是 Redux ,父子元件傳值 Eventbus

會很多層而且 Vue3 也要改,算近期看得,研究過程跟作法都答得蠻詳細的,只有 Vuex 除了

傳值以外的狀態沒仔細看。


5.如何增加首次瀏覽網頁的載入速度?

Lazyload、檔案大小...之類的。


6. React array .map為什麼 key 最好不要用 index ,用 id 之類的?

    我用 v-for 的觀念答,後來看文件才知道 React 的 map 大概就跟 Vue 的 v-for 差不多。
剩下忘了

人資:問詳細經歷,介紹作品,我比較菜就鉅細靡遺的從首頁講到產品列表講到購物車,聽得

完真的蠻猛的,介紹制度福利。

技術主管:有兩位,從考題錯的或可以改進的透過腦力激盪的方式問答,大概有非同步的

作法,有數十隻 API 分散在不同 component 要如何管理,我之前剛好看過 Mike 的API 管理那篇

文章,詳細作法當然是忘了,因為實作都兩三隻直接套就好了,詳細補完在 blog ,後面幾題

比較偏向 React 框架應用我不知道,都用 Vue 的作法回答,作品改CSS,改呈現方式。

總過程大概兩個半小時,不過有磨練到,後來得到這家的 offer。至今兩個多月的歷險記又是

另一篇故事了...。

心得:

       原本打算拖稿到就職三個月再寫,不過配合六角活動就趁假日寫一寫,旁邊還有要抽空改

的公司專案,建議大概就是欠技術債就是要還,我認為在六角學習,最有價值的就是實戰班

作品作完以後修改的那兩個半月,跟在公司作東西被退回修改的情境有87%像,作業有設計

稿,有時候還會直接給你關鍵字研究,我最近都只拿到一張 line 貼圖就要開始改了,上實戰班

的時候,原本有些技術問題都先繞過,或上課聽不懂得就先放著,結果最後還是全學起來了,

到工作的時候,最有挑戰的不是功能作不作得出來,而是要用符合團隊的作法或技術去達成。


最近活動用連結: 六角學院









2021年1月24日 星期日

應用 TypeScript Eunm 完成分類,跟就職一個月心得

    很久沒發文了感覺很廢,所以舉一個最近工作學到的東西,公司採用的框架是 React、Nest、

Typescript、Styled,所以階段性任務都在學怎麼切 React Component,跟尋寶(找有沒有前人建好

的 Component可以套或事先包好的常數),還有整個開發流程,組織算蠻扁平的,發現測試環境

掛了可以直接去問後端,同事也蠻友善。


任務大概是做一顆有三種狀態的按鈕,onClick 一個方法大家都會,Vue 跟 React 有個不同的

地方是渲染方式,Vue 只要在 data 先 set 好,數據雙向綁定跟畫面渲染通常沒太大問題,

但 React 數據是向下傳遞,一開始我還想要作兩個組件然後平行組件傳,在 React 依然是件困難

的事,並且公司的東西也不能因為一個小組件就讓你隨便傳值到 store 借放,後來作成一個組件

將按鈕控制的畫面跟按鈕放在一起,大不了把按鈕用絕對定位定到天涯海角,因此還要將畫面

的狀態設置成一個 hook ,React 才會監控並在數據變更的時候重新渲染,一開始我會 if 連發:


let status = 0

if( status === 0 ){

    狀態0

    status = 1   //切換到下一個狀態

} else if (status === 1){

    狀態1

    status = 2   //切換到下一個狀態

} else {

    狀態2

    status = 0

}


後來運用 switch:


switch(status){

case '0':

    狀態0,

    break

case '1':

    狀態1,

    break

case '2':

    狀態2,

    break

}


至此剩下一個問題是,case 0、1、2 過幾個月別人會看不懂,雖然本人通常會記得是怎麼

回事,所以這時候就要用 Eunm 把 case 變成英文:


eunm name {

OPEN:'OPEN'

'0.5X':'0.5X'

CLOSE:'CLOSE'

}


const [mode, setMode] = useState('OPEN')


React 的 useState,可以用 setMode 改變 mode 的值並重新渲染影響範圍。


change( ) => {

const nameArray = [name[OPEN], name[0.5X], name[CLOSE]]

const modeLength = nameArray.indexOf(mode)

( modeLength + 1 ) > nameArray.length ?

 setMode( nameArray[0] ) : 

 setMode(nameArray[modeLength + 1])

}

首先先做一個 enum 內容的陣列,然後找出現在狀態是第幾種,之後作一個沒事 length + 1 跳到

下一個狀態,到底則回到第一種( length = 0 )狀態的判斷。

雖然實際上的程式會變比較多行比較繞,但是在這裡可讀性的要求在節省行數之前。




參考資料:

神Q超人介紹的 Eunm