UglifyJsPlugin
plugin minify 你的 bundle 檔案來做改善es6, es7 → es5
let
const
const x = (x, y) => x * y;
const cars1 = ["Saab", "Volvo", ..."BMW"];
const cars2 = ["Fiat", "Toyota"];
const combined = [cars1, ...cars2];
class ClassName {
constructor() { ... }
}
yarn eject
package.json
config
folderyarn add styled-components
package.json
node_modules
nlp_web/lab/pokemons
底下
git pull origin pokemon_version3_cart
git checkout pokemon_version3_cart
yarn start
fetch
來抓 API datanote: version3
git pull origin main
useFetch
; git pull origin pokemon_version2_custom_hook
git pull origin pokemon_version3_cart
Note: 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);
useState
useState
是一個讓你增加 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
useEffect
side effect 在這裡做
useEffect
useEffect 有什麼作用? 透過使用這個 Hook,你告訴 React 你的 component 需要在 render 後做一些事情。React 將記住你傳遞的 function(我們將其稱為「effect」),並在執行 DOM 更新之後呼叫它。
useEffect
每次 render 後都會執行 useEffect 嗎? 是的!預設情況下,它在第一個 render 和隨後每一個更新之後執行。你可能會發現把 effect 想成發生在「render 之後」更為容易
note: version1
useFetch
hook 讓你不需要改變 component 階層就能重用 stateful 的邏輯
note: version2
handleAddToCard
note: version3
note: version3
yarn add styled-components
yarn add styled-components