UglifyJsPlugin plugin minify 你的 bundle 檔案來做改善es6, es7 → es5
let constconst x = (x, y) => x * y;
const cars1 = ["Saab", "Volvo", ..."BMW"];
const cars2 = ["Fiat", "Toyota"];
const combined = [cars1, ...cars2];
class ClassName {
constructor() { ... }
}
yarn ejectpackage.jsonconfig folderyarn add styled-componentspackage.jsonnode_modulesnlp_web/lab/pokemons 底下
git pull origin pokemon_version3_cartgit checkout pokemon_version3_cartyarn startfetch 來抓 API datanote: version3
git pull origin mainuseFetch; git pull origin pokemon_version2_custom_hookgit pull origin pokemon_version3_cartNote: slides 到 main branch 看最新的
Note: 切 branches demo 用,之後會把 brances 刪掉, nlp_web/lab/pokemons 只留 final version pokemon_version3_cart
DOM 將一份 HTML 文件看作是一個樹狀結構的物件,讓我們可以方便直觀的存取樹中的節點 (node) 來改變其結構、樣式 (CSS) 或內容等
const root = ReactDOM.createRoot(
document.getElementById('root')
);
const element = <h1>Hello, world</h1>; // react element
root.render(element);
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
此 function 是一個符合規範的 React component,因為它接受一個「props」(指屬性 properties)物件並回傳一個 React element。我們稱之為 function component,因為它本身就是一個 JavaScript function。你也可以使用 ES6 Class 來定義 component, 上述兩種 component 在 React 中是同等的。
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
<div id="root"></div>
const root = ReactDOM.createRoot(
document.getElementById('root')
);
const element = <h1>Hello, world</h1>;
root.render(element);
<div id="root" />Component 使你可以將 UI 拆分成獨立且可複用的程式碼,並且專注於各別程式碼的思考。
以經驗來說
note: version1


是一個 JavaScript 的語法擴充。透過這個語法來描述使用者介面的外觀
執行 JSX 會產生 React「element」。
JSX 允許你使用 JavaScript 所有的功能。
const element = <h1>你好,世界!</h1>;
const name = 'Josh Perez';
const element = <h1>Hello, {name}</h1>;
function formatName(user) {
return user.firstName+ ' ' + user.lastName;
}
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
const element = (
<h1>
Hello, {formatName(user)}!
</h1>
);
sumPrices in JSXnote: version1 props: handleAddToCart, pokemonUrl
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
import React, { useState } from 'react';
function Example() {
// 宣告一個新的 state 變數,我們稱作為「count」。
const [count, setCount] = useState(0);
useStateuseState 是一個讓你增加 React state 到 function component 的 Hook。
import React, { useState } from 'react';
function Example() {
// 我們呼叫 useState Hook 宣告了一個新的 state 變數。並回傳了一對由我們命名的值。我們將代表點擊數的變數命名為 count
// setState -> 更新 state 的 function
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
{/** 當使用者點擊,我們就呼叫 setCount 並傳入新的值。然後 React 就會 re-render Example component,並傳入新的 count 值。 */}
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
note: version1, state: loading, error, pokemons, count
useEffectside effect 在這裡做
useEffectuseEffect 有什麼作用? 透過使用這個 Hook,你告訴 React 你的 component 需要在 render 後做一些事情。React 將記住你傳遞的 function(我們將其稱為「effect」),並在執行 DOM 更新之後呼叫它。
useEffect每次 render 後都會執行 useEffect 嗎? 是的!預設情況下,它在第一個 render 和隨後每一個更新之後執行。你可能會發現把 effect 想成發生在「render 之後」更為容易
note: version1
useFetch
hook 讓你不需要改變 component 階層就能重用 stateful 的邏輯
note: version2
handleAddToCardnote: version3
note: version3
yarn add styled-componentsyarn add styled-components