React 元件:類別與函數式。
我的 React 之旅始於四年前的函數式元件和 Hook。然後是'Siswe,他是訓練營的參與者,也是我們常駐班的組件愛好者。當我們其他人在使用功能組件的團隊專案上進行協作時,「Siswe 堅定不移地忠誠於類別組件。
元件是使用者介面 (UI) 的建構塊。
將它們視為樂高積木 - 您可以以各種方式組合它們來創建複雜的結構。它們是獨立且可重複使用的程式碼片段,封裝了 UI 和邏輯。
在另一個元件中重複使用一個元件通常如下所示:
import MyComponent from './MyComponent'; function ParentComponent() { return ( <div> <MyComponent /> </div> ); }
類別元件和功能元件是在 React 中建立元件的兩種主要方式。
import React, { Component } from 'react'; class Counter extends Component { constructor(props) { super(props); this.state = { count: 0 }; } handleClick = () => { this.setState({ count: this.state.count + 1 }); }; render() { return ( <div> <p>You clicked {this.state.count} times</p> <button onClick={this.handleClick}>Click me</button> </div> ); } } export default Counter;
這是一個類別元件,使用擴充 React.Component 類別的 JavaScript 類別建立。
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); const handleClick = () => { setCount(count + 1); }; return ( <div> <p>You clicked {count} times</p> <button onClick={handleClick}>Click me</button> </div> ); } export default Counter;
另一方面,這是一個函數元件,寫為簡單的 JavaScript 函數。
狀態管理:核心區別。
類別元件使用 this.state 管理自己的內部狀態。這通常在建構函數中初始化,使用 this.state 物件訪問,並使用 this.setState 方法更新,如上面的程式碼區塊所示。
功能組件最初是無狀態的。但隨著 Hooks 的引入,他們獲得了管理狀態和生命週期邏輯的能力。利用 useState 掛鉤來管理狀態,它會傳回一對值:目前狀態和更新它的函數,如上所示。這對於簡單的狀態管理來說已經足夠了。對於涉及多個子值的更複雜的狀態邏輯,或者當下一個狀態依賴前一個狀態時,您需要使用 useReducer。
例如:
import React, { useReducer } from 'react'; const initialState = { count: 0, step: 1, }; const reducer = (state, action) => { switch (action.type) { case 'increment': return { ...state, count: state.count + state.step }; case 'decrement': return { ...state, count: state.count - state.step }; case 'setStep': return { ...state, step: action.payload }; default: throw new Error(); } }; function Counter() { const [state, dispatch] = useReducer(reducer, initialState); const increment = () => dispatch({ type: 'increment' }); const decrement = () => dispatch({ type: 'decrement' }); const setStep = (newStep) => dispatch({ type: 'setStep', payload: newStep }); return ( <div> <p>Count: {state.count}</p> <p>Step: {state.step}</p> <button onClick={increment}>+</button> <button onClick={decrement}>-</button> <input type="number" value={state.step} onChange={(e) => setStep(Number(e.target.value))} /> </div> ); } export default Counter;
這裡,useReducer 以結構化且可維護的方式管理多個狀態值和複雜的更新邏輯。 Hooks 專門用於功能組件。
避免直接操作兩個組件中的狀態物件。
無論組件類型為何,都不要直接修改或改變狀態物件。相反,使用更新的值建立一個新物件。這種方法有助於 React 有效地追蹤變更並優化重新渲染。
功能組件範例:
import React, { useState } from 'react'; function UserProfile() { const [user, setUser] = useState({ name: 'Jane Doe', age: 30 }); const handleNameChange = (newName) => { setUser({ ...user, name: newName }); // Create a new object with updated name }; return ( <div> <p>Name: {user.name}</p> <p>Age: {user.age}</p> <input type="text" value={user.name} onChange={(e) => handleNameChange(e.target.value)} /> </div> ); } export default UserProfile;
類別組件範例:
import React, { Component } from 'react'; class UserProfile extends Component { state = { user: { name: 'Jane Doe', age: 30 } }; handleNameChange = (newName) => { this.setState(prevState => ({ user: { ...prevState.user, name: newName } // Create a new object with updated name })); }; render() { return ( <div> <p>Name: {this.state.user.name}</p> <p>Age: {this.state.user.age}</p> <input type="text" value={this.state.user.name} onChange={(e) => this.handleNameChange(e.target.value)} /> </div> ); } } export default UserProfile;
在這兩個範例中,我們都在更新使用者物件的 name 屬性,同時保留原始物件的完整性。這確保了創建新的狀態對象,保持不變性並防止狀態更新的潛在問題。遵守這一點可確保可預測的行為、效能優化和更輕鬆的調試。
类组件用于复杂的逻辑。
- 复杂的状态管理:在处理需要细粒度控制的复杂状态逻辑时,带有 this.state 和 this.setState 的类组件可以提供更大的灵活性。
- 生命周期方法:对于严重依赖生命周期方法(如 componentDidMount、componentDidUpdate 或 componentWillUnmount)的组件,类组件是传统的选择。
- 错误边界:为了处理组件树中的错误并防止崩溃,带有 componentDidCatch 的类组件是必不可少的。
- 性能优化:在特定的性能关键场景中,可以利用类组件中的PureComponent或shouldComponentUpdate。
- 旧代码库:如果您正在开发一个严重依赖类组件的现有项目,那么通过将它们用于新组件可能会更容易保持一致性。
功能组件用于简单视图。
- 简单组件:对于具有最少状态或逻辑的表示组件,功能组件由于其简单性和可读性通常是首选。
- 使用 Hooks 进行状态管理:在功能组件中利用 useState 和 useReducer 提供了一种强大而灵活的状态管理方式。
- 副作用: useEffect 挂钩允许管理副作用,例如数据获取、订阅或手动 DOM(文档对象模型)操作。
- 性能优化: useMemo 和 useCallback 可用于优化功能组件的性能。
让您的组件需求指导您的决定。
函数式方法通常被认为更简洁和可读,并且由于简单和高效而通常就足够了。然而,类组件提供了对状态管理和生命周期方法的更多控制,特别是在处理复杂的逻辑或性能优化时。这意味着组织复杂逻辑的更好结构。
类组件和函数组件之间的选择并不总是明确的,因为没有严格的规则。评估组件的要求并选择最适合您的项目要求的类型。
您更喜欢使用哪个组件?
以上是React 元件:類別與函數式。的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務
