# React Hooks - Day1(簡報版) [[Day 01] 沒學過 React 可以從 Hooks 開始嗎?](https://ithelp.ithome.com.tw/articles/10216355) [[Day 02] React 中一定會用到的 JavaScript 語法](https://ithelp.ithome.com.tw/articles/10217085) --- ## 心態建立 沒有學過 React,反而可能是優勢 ---- Redux 的作者 Dan Abramov 說過 > Hooks 是一個新的思維方式,所以有時候你要忘掉原本學過的,反而更能幫助你學習新的東西。 --- ## 需要具備的能力 ---- - HTML - CSS - JavaScript ---- 你該不會該好都學過吧? 那就可以開始寫 React Hooks 了! --- ## React 中會用到的 ES6 語法 ---- ### 樣板字面值 Template literal / Template String ---- 將原本字串用 `'` 包起來的符號改成 \` 包起來,並在需要放入表達式的地方用 `${}` 包起來。 ```javascript= const name = 'AllenLiao' console.log(`The most handsome person: ${name}`) // 'The most handsome person: AllenLiao' ``` ---- ### 箭頭函式 Arrow Function ---- 一般宣告函式 ```javascript= function showTheBestSinger(name) { return `小樹屋靈魂歌姬:${name}` } console.log(showTheBestSinger('Didi')) // '小樹屋靈魂歌姬:Didi' ``` ---- 用 Function Expression 搭配箭頭函式 ```javascript= const showTheBestSinger = (name) => { return `小樹屋靈魂歌姬:${name}` } console.log(showTheBestSinger('Didi')) // '小樹屋靈魂歌姬:Didi' ``` ---- 帶入的參數只有一個時可以省略 `()` ```javascript= const showTheBestSinger = name => { return `小樹屋靈魂歌姬:${name}` } console.log(showTheBestSinger('Didi')) // '小樹屋靈魂歌姬:Didi' ``` ---- 如果沒有參數則一定要加 `()` ```javascript= const showTheBestSinger = () => { return `小樹屋靈魂歌姬:Didi` } console.log(showTheBestSinger()) // '小樹屋靈魂歌姬:Didi' ``` ---- function 的內容只有一行的話可以省略 `{}` ```javascript= const showTheBestSinger = name => `小樹屋靈魂歌姬:${name}` console.log(showTheBestSinger('Didi')) // '小樹屋靈魂歌姬:Didi' ``` ---- 前後比較 ```javascript= function showTheBestSinger(name) { return `小樹屋靈魂歌姬:${name}` } console.log(showTheBestSinger('Didi')) // '小樹屋靈魂歌姬:Didi' ``` ⇓ ```javascript= const showTheBestSinger = name => `小樹屋靈魂歌姬:${name}` console.log(showTheBestSinger('Didi')) // '小樹屋靈魂歌姬:Didi' ``` 少打很多字超爽der ---- ### 物件屬性縮寫 ---- 當物件的**屬性名稱** 跟指定給屬性當值的**變數名稱**相同時 可以省略屬性值不寫 ---- ```javascript= const nickname = '大 ben' const petPhrase = '??' const ben = { nickname: nickname, petPhrase: petPhrase } console.log(ben.petPhrase) // '??' ``` ⇓ ```javascript= const nickname = '大 ben' const petPhrase = '??' const ben = { nickname, petPhrase } console.log(ben.petPhrase) // '??' ``` ---- ### 解構賦值 Destructuring Assignment ---- 帥氣並快速的建立變數並取出物件或陣列中的值 ---- #### 物件的解構賦值 ---- 一般從物件取出屬性值,並建立新的變數 ```javascript= const angelina = { nickname: '安你老師', personality: '很兇', interest: '叫別人念咒語' } const personality = angelina.personality // '安你老師' ``` ---- 使用解構賦值 可以把物件的屬性值 賦值給該屬性的同名變數 ```javascript= const angelina = { nickname: '安你老師', personality: '很兇', interest: '叫別人念咒語' } const { nickname, interest } = angelina console.log(`${nickname}喜歡${interest}`) // '安你老師喜歡叫別人念咒語' ``` ---- #### 陣列的解構賦值 ---- 一般從陣列的值建立新的變數 ```javascript= const handsomeThree = ['Allen', 'Jason', 'Hsuan'] const first = handsomeThree[0] // 'Allen' const second = handsomeThree[1] // 'Jason' const third = handsomeThree[2] // 'Hsuan' ``` ※以上順序不是依照帥氣程度 ---- 使用解構賦值 建立變數並賦予陣列相對應的位置的值 ```javascript= const handsomeThree = ['Allen', 'Jason', 'Hsuan'] const [first, second, third] = handsomeThree console.log(first) // 'Allen' console.log(second) // 'Jason' console.log(third) // 'Hsuan' ``` ※以上順序不是依照帥氣程度 ---- ### 展開語法和其餘語法 Spread Syntax / Rest Syntax ---- 使用在物件跟陣列上 同樣是用 `...` 但使用的時機不同 ---- #### 展開語法 Spread Syntax ---- 可以將陣列或物件「解壓縮」 而且可以同時新增新的值 ---- 陣列 ```javascript= const array = [1, 2, 3] const newArray = [...array, 4, 5] console.log(array) // [1, 2, 3] console.log(newArray) // [1, 2, 3, 4, 5] ``` ---- 物件 ```javascript= const sisi = { name: 'Sisi', habit: '崩潰' } const newSisi = { ...sisi, name: 'Paimia', nickname: '背殺' } console.log(sisi) // {name: 'Sisi', habit: '崩潰'} console.log(newSisi) // {name: 'Paimia', habit: '崩潰', nickname: '背殺'} ``` 因為原物件已經有 `name` 屬性 新物件的 `name` 會覆寫原物件的 `name` ---- #### 其餘語法 Rest Syntax ---- 將物件或陣列沒被取出來的屬性或元素「壓縮」 ---- 陣列 ```javascript= const superJuniors = [ 'Allen', 'Jason', 'Angelina', 'Benben', 'Didi', 'a_u_z', 'sixwing', 'Raye', 'rich' ] const [handsome, alsoHandsome, ...others] = superJunior console.log(handsome) // 'Allen' console.log(alsoHandsome) // 'Jason' console.log(others) // [ // 'Angelina', 'Benben', 'Didi', // 'a_u_z', 'sixwing', 'Raye', 'rich' // ] ``` ---- 物件 ```javascript= const titles = { hooks: ['Allen', 'a_u_z', 'rich'], leetcode: ['Angelina', 'Benben', 'Raye'], es6: ['sisi', 'Jason', 'Didi'], css: ['a', 'b', 'c'], html: ['d', 'e', 'f'] } const { hooks, leetcode, es6, ...losers } = titles console.log(losers) // {css: Array(3), html: Array(3)} ``` ---- 不管是展開語法還是其餘語法 `...` 都是淺拷貝(Shallow Copy) ```javascript= const arr1 = [1, [2]] const arr2 = [...arr1] arr2[1][0] = 22 console.log(arr1[1][0]) // 22 ``` --- ## 補充 ---- ### 表達式(Expressions) ### 和 ### 陳述句(Statements) ---- #### [表達式(Expressions)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#expressions) > An expression is any valid unit of code that resolves to a value. > 表達式是任何一段可以取得一個值的程式碼。 ---- Expressions 有兩種形式: 1. 有副作用的,ex:`x = 7` 2. 只為了取得值而解析的,ex:`3 + 4` 簡單來說, 只要在瀏覽器的 console 打程式碼, 如果有回傳值,就是 Expressions。 ---- ![](https://i.imgur.com/xcCIsk2.png) 圖片來源:[[筆記] 進一步談JavaScript中函式的建立─function statements and function expressions](https://pjchender.blogspot.com/2016/03/javascriptfunction-statements-and.html) ---- #### [陳述句(Statements)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements) ---- 研究了一陣子, 還是沒辦法知道定義是什麼, 頭好痛。 ---- 根據 [重讀 Axel 的 Javascript 中的 Expression vs Statement 一文](https://andyyou.github.io/2016/03/06/expressions-vs-statements-in-js/) 的說法, Statements 就是執行動作、完成特定任務。 例如賦值、迴圈、if、else 等,都是 Statements。 ---- 還有一些長得很像 Statements 的 Expressions, 詳情請看: [重讀 Axel 的 Javascript 中的 Expression vs Statement 一文](https://andyyou.github.io/2016/03/06/expressions-vs-statements-in-js/) ---- ### Function Statements ### 和 ### Function Expressions ---- #### Function Statements ---- ```javascript= function greet() { console.log('Hi') } ``` 上面的程式碼是 Function Statement, 也叫做 Function Declaration, 就是最一般的宣告函式的方法。 ---- ```javascript= greet() // 'Hi' function greet() { console.log('Hi') } ``` 因為 JavaScript 的 Hoisting 特性,我們可以在宣告 `greet` 之前就先執行他。 ---- #### Function Expressions ---- ```javascript= const greet = function() { console.log('Hi') } ``` ---- 跟 Function Statements 不一樣, Function Expressions 是宣告一個變數, 再把一個匿名函式賦值給他。 用 Function Expressions 的方式, 就沒辦法在宣告之前就執行他了。 ---- ```javascript= greet() // ReferenceError: Cannot access 'greet' before initialization const greet = function() { console.log('Hi') } ``` ---- 依照 Hoisting 的特性, 只有宣告會提升,賦值不會, 我覺得蠻合理的。 ---- ### 淺拷貝和深拷貝 Shallow Copy / Deep Copy ---- #### 淺拷貝 在複製物件或陣列時, 只有第一層是複製值, 第二層開始是複製位址。 ---- #### 深拷貝 在複製物件或陣列時, 每一層都是乖乖的複製值過去。 ---- ```javascript= const arr = [1, [2]] const shallowCopyArr = [...arr] const deepCopyArr = JSON.parse(JSON.stringify(arr)) shallowCopyArr[1][0] = 22 console.log(arr) // [1, [22]] console.log(shallowCopyArr) // [1, [22]] console.log(deepCopyArr) // [1, [2]] ``` --- ## 參考資料: 1. [[筆記] 進一步談JavaScript中函式的建立─function statements and function expressions](https://pjchender.blogspot.com/2016/03/javascriptfunction-statements-and.html) 2. [表達式(Expressions)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Expressions_and_Operators#expressions) 3. [重讀 Axel 的 Javascript 中的 Expression vs Statement 一文](https://andyyou.github.io/2016/03/06/expressions-vs-statements-in-js/) 4. [覺得 JavaScript function 很有趣的我是不是很奇怪](https://blog.huli.tw/2020/04/18/javascript-function-is-awesome/) 5. [JavaScript 淺拷貝 (Shallow Copy) 與深拷貝 (Deep Copy)](https://awdr74100.github.io/2019-10-24-javascript-deepcopy/) ###### tags: `Super Junior`
{"metaMigratedAt":"2023-06-16T06:53:51.305Z","metaMigratedFrom":"YAML","title":"React Hooks - Day1(簡報版)","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"5f6f7313-cb28-4e97-a34d-c7bc1cc53cbc\",\"add\":8781,\"del\":962}]"}
    488 views