###### tags: React筆記 React筆記 === JSX --- * 我長這樣: ```javascript= const element = <h1>您好呀!</h1> ``` 寫過程式都知道,這不是字串也不是html語法。 字串要有雙引或單引,HTML也不會有變數宣告。 這其實就是JSX,融合了HTML與Javascript。 在React世界裡,也有人稱呼JSX為一個element。 * 執行JSX會產生React Element。 * React.createElement會產生React Element,如下: ```javascript= const element = { type: 'h1', props: { className: 'greeting', children: 'Hello World!' } } ``` 這些東西決定了你的畫面長怎樣。 React會把你給的這些物件的描述轉換成DOM並且保持他們是最新的狀態。 如何把React Element Render到DOM上 --- * 與瀏覽器的DOM不同,React element是單純的物件,如上所看到的。 * React DOM會負責更新DOM,來符合React element所描述的內容。 那麼React element到底是如何render到DOM上的? 首先,先說一下root DOM node,以下: ```javascript= const root = <div id="root"></div> ``` 通常在開發React應用程式時,會建立一個Root DOM node,所有包含在內的React element都是由React DOM做管理。 假設你想要render一個React element 到root DOM node: ```javascript= const element = <h1>Hello, world</h1>; ReactDOM.render(element, document.getElementById('root')); ``` 更新已經被Render在畫面上的Element --- * React Element是immutable,一旦被建立出來就不能改它的children或props,因此你想讓畫面更動就是建立一個新的element,然後再呼叫ReactDOM.render()。通常不會這樣啦!後面會提到state可以做到這件事。 * 但是ReactDOM在真的更新畫面之前,會先將新的element與children與先前的element與children做比較,為的是增叫效能,只更新必要的元件。 React Component 與 Props --- * 以函數式component為例,需接收一個props物件並回傳一個React element。 回顧:React element,可以是自定義的component --- 以下是一般常見的element: ```javascript= const element = { type: 'h1', props: { className: 'greeting', children: 'Hello World!' } } //其實就是 const element = <h1 className="greeting">'Hellow World!'</h1> ``` 但其實可以是component: ```javascript= const element = <Welcome name="Sara" />; // 等價於 const element = { type: 'Welcome', props: { name: 'Sara' } } ``` 當React看到使用者自定義的component當作element時,他會將該JSX的屬性和children變成一個object並傳給該component,這裡的object就是props。 抽離component --- * 不要介意拆分多個component,拆分後的component,建議以component的角度為props命名。 Props是唯獨的 --- * 所有的React component都必須像Pure function一樣,不可去更改props。 React事件與DOM事件 --- setState為何要使用不可變值 --- setState同步還是異步 --- * 可能是同步或非同步。 * React會將多個setState()呼叫批次處理,是為了提高效能;也正因為props和state可能是非同步被更新,因此不要依賴他的直再去計算新的state。 * 你想解決這個問題可以是用另一種型態的setState()。 ```javascript= this.setState((state, props) => ({ counter: state.counter + props.increment })); ``` setState何時會合併state --- React函數組件與class組件 ---
{"metaMigratedAt":"2023-06-16T05:02:42.225Z","metaMigratedFrom":"Content","title":"React筆記","breaks":true,"contributors":"[{\"id\":\"c93b5207-9140-476f-b4e4-2d57fccebd5f\",\"add\":2354,\"del\":90}]"}
Expand menu