2-4
Loop labels
// 替迴圈做標籤,使其用在 break 或 continue 等操作上
loop1: for (var i = 0; i < 4; i++) {
loop2: for (var j = 0; j < 5; j++) {
if (i === 1) {
continue loop1
}
console.log('loop1', i, 'loop2', j)
}
}
Map 物件
- 和一般 Object 物件最大不同是,map 的 key 可以是物件
- https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Map
Set 物件
- 可儲存任何類型的唯一值,不論是基本型別值或物件參考
- https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Set
Binary Math
- 在 JavaScript 的小數點計算中,
0.1 + 0.2 = 0.30000000000000004
,此原因為電腦計算是用二進制,在某些值會有無窮小數的產生,相同於我們常用的十進制中1/3 + 2/3
的情況,0.333333..... + 0.666666...... != 1
。 - 在此情況下若要判斷某個小數點的話要用範圍,例如:
X >= 0.3 && X <= 0.30001
用小範圍判斷
console.time()
console.time('timer')
for(let i=1; i<=10000000; i++) {}
console.timeEnd('timer')
// timer: 4.34765625 ms
console.time()
執行時會開始計時直到執行console.timeEnd()
才會結束計時,傳入的參數字串類似 timeID 用於分別是哪個計時。
console.assert()
let someValue = 50
console.assert(someValue === 5000, 'error message')
// Assertion failed: console.assert
console.assert()
會根據第一個參數布林值來印出 log,ture 不會印出,false 會有 error 印出- 第二個參數為選填,用於輸出時的訊息文字
Redux toolkit
- 因 Redux 本身概念有很多種實作方式且需要編寫重複性高的 code,故 Redux 官方推出了 Redux toolkit 工具提供標準實作與簡化使用 Redux。
- toolkit 提供了許多 API 能很輕易的建立 Redux 的三大核心:store、action、reducer
- 在 reducer 中做變更 store 的事情一定要用 pure function 來 return 新的值做更新,但在 Redux toolkit 中定義的 reducer 裡使用了
immer
library 讓我們可以直接變更 store 的值來更新。 - Avoid putting non-serializable values such as Promises, Symbols, Maps/Sets, functions, or class instances into the Redux store state or dispatched actions. (簡言之 store 存的與 action 的 payload 不能是 stringfy 不了的物件,若有 middleware 將 action.payload 做處理轉成 serializable values,則可以在 payload 傳 non-serializable values,但個人覺得實作上還是盡量統一)
- 處理非同步行為的 middleware, Redux toolkit 有結合
redux-thunk
並提供createAsyncThunk
API 建立 promise,並會在 promise 的三個週期 dispatch action。 - 以 slice 為概念單位區分不同的 store data。
Git push -u
-u
參數主要將目前分支與遠端 origin 的 mybranch1 分支建立關聯,若遠端沒有則會建立該分支- 此後在目前分支直接下
git push
即可,可省略後面參數
git push -u origin mybranch1
—set-upstream
是指定本地與遠端 origin 已有的分支建立關聯
git branch —set-upstream-to=origin/mybranch1 mybranch1
Git origin
- origin 為常用的遠端 repository 名稱,也能改為其他名稱:若改成 myremote,則變成
git push myremote master
- Github clone 下來的 repository,預設遠端 repository 名稱為 origin
React-Router 中 match 的 path 和 url
match.url
取得實際的路徑值字串match.``path
取得路徑格式字串- 舉例:url → users/5, path → /users/:userId
- 一般使用場景
match.url
常用在<Link>
指定實際的路徑,match.path
常用在<Route>
匹配特定格式的路徑 - 根據特定需求有時
<Route>
也會使用match.url
作為前綴的匹配路徑
Open API
- 可以開發時測試用的 open API: https://httpbin.org/
網頁本身轉址
- 程式碼如下:在解析 HTML 時到這段 0秒後就會 redirect 到指定的 url
<meta http-equiv="refresh" content="0;url=https://ithelp.ithome.com.tw/questions/10203024" />
- content 第一個參數是幾秒後做 refresh 動作
- 後面沒有 url 參數的話,就是幾秒後 refresh 目前的網頁
React list index
- 與 Vue 類似,以陣列渲染出多個元素時,需要給定 unique key 才能在畫面更新時辨識
- 若以陣列 index 做 key 的話,只要陣列排序有改動,就會造成整個陣列元素重新渲染,以效能來說是不好的
- 而 Redux Toolkit 本身有包含
nanoid
的 function,可以方便在資料本身沒有 ID 時做使用 - 在 Vue 中同個頁面的不同陣列渲染元素若有重複的 key 會有 warning,在 React 中,不同陣列渲染的元素有重複的 key 不會有事,因為 React 是以陣列本身為 key 的作用域。
React Router
<Switch location={background || location}>
- Switch 內的 Route 只能有一個 Route 被渲染,根據 location 的值決定渲染哪個 Route,location 本身不用額外寫 props 給 Switch,除非有以下的用法需求。
- https://reactrouter.com/web/example/modal-gallery 範例中兩個 Route path="/img/:id" 不會同時渲染的原因是,在 Gallery 內點擊 Link 時設的 state.background 為 Gallery 路徑的 location 資料,在外層 ModalSwitch,若 state 有值則用 state.background 做為 Switch 的 location,因此就算路徑改變也因為有 state 的值改寫 location 成原本的路徑 loaction 所以原本的畫面不變,Modal 因為不在該 Switch 內而且根據 state.background 渲染,而會在原本的畫面中出現。