」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > React 元件:類別與函數式。

React 元件:類別與函數式。

發佈於2024-08-05
瀏覽:858

React Components: Class vs Functional.

我的 React 之旅始于四年前的功能组件和 Hooks。然后是'Siswe,他是训练营的参与者,也是我们常驻班的组件爱好者。当我们其他人在使用功能组件的团队项目上进行协作时,“Siswe 坚定不移地忠诚于类组件。

组件是用户界面 (UI) 的构建块。

将它们视为乐高积木 - 您可以以各种方式组合它们来创建复杂的结构。它们是封装 UI 和逻辑的独立且可重用的代码片段。

在另一个组件中重用一个组件通常如下所示:

import MyComponent from './MyComponent';

function ParentComponent() {
  return (
    
); }

类组件和功能组件是在 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  
 (
   
    

You clicked {this.state.count} times

        
  );  } } export default Counter;

这是一个类组件,使用扩展 React.Component 类的 JavaScript 类创建。

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  const handleClick = () => {
    setCount(count   1);
  };

  return (
    

You clicked {count} times

); } 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 (
    

Count: {state.count}

Step: {state.step}

setStep(Number(e.target.value))} />
); } 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 (
    

Name: {user.name}

Age: {user.age}

handleNameChange(e.target.value)} />
); } 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 (
      

Name: {this.state.user.name}

Age: {this.state.user.age}

this.handleNameChange(e.target.value)} />
); } } export default UserProfile;

在这两个示例中,我们更新用户对象的 name 属性,同时保留原始对象的完整性。这确保了创建新的状态对象,保持不变性并防止状态更新的潜在问题。遵守这一点可确保可预测的行为、性能优化和更轻松的调试。

类组件用于复杂的逻辑。

  • 复杂的状态管理:在处理需要细粒度控制的复杂状态逻辑时,带有 this.state 和 this.setState 的类组件可以提供更大的灵活性。
  • 生命周期方法: 对于严重依赖生命周期方法(如 componentDidMount、componentDidUpdate 或 componentWillUnmount)的组件,类组件是传统的选择。
  • 错误边界:为了处理组件树中的错误并防止崩溃,带有 componentDidCatch 的类组件是必不可少的。
  • 性能优化:在特定的性能关键场景中,可以利用类组件中的PureComponent或shouldComponentUpdate。
  • 遗留代码库:如果您正在开发一个严重依赖类组件的现有项目,那么通过将它们用于新组件可能会更容易保持一致性。

功能组件用于简单视图。

  • 简单组件:对于具有最少状态或逻辑的表示组件,功能组件由于其简单性和可读性通常是首选。
  • 使用 Hooks 进行状态管理: 在功能组件中利用 useState 和 useReducer 提供了一种强大而灵活的状态管理方式。
  • 副作用: useEffect 挂钩允许管理副作用,例如数据获取、订阅或手动 DOM(文档对象模型)操作。
  • 性能优化: useMemo 和 useCallback 可以用来优化功能组件中的性能。

让您的组件需求指导您的决定。

函数式方法通常被认为更简洁和可读,并且由于简单和高效而通常就足够了。然而,类组件提供了对状态管理和生命周期方法的更多控制,特别是在处理复杂的逻辑或性能优化时。这意味着组织复杂逻辑的更好结构。

类组件和功能组件之间的选择并不总是明确的,因为没有严格的规则。评估组件的要求并选择最适合您的项目要求的类型。

您更喜欢使用哪个组件?

版本聲明 本文轉載於:https://dev.to/taiwocodes/react-components-class-vs-functional-5ebm?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在java中的多個返回類型:一個誤解介紹,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但是,情況確實如此嗎? 通用方法:拆開神秘 [方法僅具有單一的返回類型。相反,它採用機制,如鑽石符號“ ”。 分解方法簽名: :本節定義了一個通用類型參數,E。它表示該方法接受了擴展foo類...
    程式設計 發佈於2025-02-07
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    在嘗試將image存儲在mysql數據庫中時,您可能會遇到一個可能會遇到問題。本指南將提供成功存儲您的圖像數據的解決方案。 easudy values('$ this-> ; image_id','file_get_contents($ tmp_imag...
    程式設計 發佈於2025-02-07
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-02-07
  • 如何將數據插入MySQL:相當於MS SQL的散裝插入物?
    如何將數據插入MySQL:相當於MS SQL的散裝插入物?
    在MySQL中插入:在數據庫管理的領域中拆開其等效於MS SQL 的等價,有效數據加載是必不可少的。 Microsoft SQL Server擁有批量插入命令,用於迅速從文本文件中導入數據。同樣,MySQL提供了一個類似的解決方案來完成此任務。 在MySQL中執行批量插入操作,使用的主要技術是負...
    程式設計 發佈於2025-02-07
  • 如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    如何使用char_length()在mySQL中按字符串長度對數據進行排序?
    [2使用內置的char_length()function。 char_length()和length() 此查詢將從指定的表中檢索所有行,並基於上升順序對它們進行排序指定列的字符長度。帶有更長字符串的行將出現在結果的底部。
    程式設計 發佈於2025-02-07
  • 如何使用LOAD_FILE故障排除MySQL Blob加載問題?
    如何使用LOAD_FILE故障排除MySQL Blob加載問題?
    加載文件加載到mysql blobs中,帶有load_file ,假設您會遇到問題,將文件加載到mysql blob中,專門使用load_file函數。如文檔中概述的,該功能的功能需要在服務器上滿足某些條件。這些條件包括:[在服務器主機文件對所有用戶的訪問性 文件大小以下下方的max_allowe...
    程式設計 發佈於2025-02-07
  • 為什麼使用Firefox後退按鈕時JavaScript執行停止?
    為什麼使用Firefox後退按鈕時JavaScript執行停止?
    導航歷史記錄問題:JavaScript使用Firefox Back Back 此行為是由瀏覽器緩存JavaScript資源引起的。 To resolve this issue and ensure scripts execute on subsequent page visits, Firefox...
    程式設計 發佈於2025-02-07
  • 如何在Java列表中有效計算元素的發生?
    如何在Java列表中有效計算元素的發生?
    計數列表中的元素出現在列表 中,在java編程中,列舉列表中列舉元素出現的任務來自列表。為此,收集框架提供了全面的工具套件。 在這種情況下,Batocurrences變量將保持值3,代表動物列表中的“ BAT”出現的數量。 &&& [此方法是簡單的,可以得出準確的結果,使其成為計算列表中元素出現的...
    程式設計 發佈於2025-02-07
  • 如何在附帶的SQLite數據庫中訪問表和行?
    如何在附帶的SQLite數據庫中訪問表和行?
    [2 [2 本指南詳細介紹瞭如何在附加的SQLite數據庫中訪問表和行。 附加 [2 1。在附件數據庫中識別表: 使用sqlite3命令行工具。 。表命令在主數據庫中顯示所有表格,包括附加數據庫中的所有表。 2。檢查表結構: 使用命令 3。檢索表數據: 使用SQL查詢從表中檢索所有...
    程式設計 發佈於2025-02-07
  • 如何使用fetch api將形成數據以\“ application/x-www-form-urlencoded \”的形式發布?
    如何使用fetch api將形成數據以\“ application/x-www-form-urlencoded \”的形式發布?
    在使用FECH API中的FormData接口來發布表單數據時,使用fetch api ,對[1]); } ,使用實驗方法: 使用fetch api:將post請求發送到urlsearchparams對象。請勿指定內容類型標頭,因為默認值將為“ application/x-www-form-ur...
    程式設計 發佈於2025-02-07
  • \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    \“(1)vs.(;;):編譯器優化是否消除了性能差異?\”
    使用(1)而不是(;;)會導致無限循環的性能差異? 現代編譯器,(1)和(;;)之間沒有性能差異。 是如何實現這些循環的技術分析在編譯器中: perl: S-> 7 8 unstack v-> 4 -e語法ok 在GCC中,兩者都循環到相同的彙編代碼中,如下所示:。 globl t_時 ...
    程式設計 發佈於2025-02-07
  • 為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    為什麼儘管有效代碼,為什麼在PHP中捕獲輸入?
    [2 _post ['ss'];? > 的目的是從單擊提交按鈕時,文本框並顯示。但是,輸出保持空白。當方法=“ get”無縫工作時,方法=“ post”構成問題。 檢查action屬性:如果您正在刷新頁面,請將操作屬性設置為空字符串,例如] action ='&...
    程式設計 發佈於2025-02-07
  • 如何在整個HTML文檔中設計特定元素類型的第一個實例?
    如何在整個HTML文檔中設計特定元素類型的第一個實例?
    [2單獨使用CSS,整個HTML文檔可能是一個挑戰。 the:第一型偽級僅限於與其父元素中類型的第一個元素匹配。 以下CSS將使用添加的類樣式的第一個段落: }
    程式設計 發佈於2025-02-07
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    克服go mod中的模塊路徑差異 coreos/bbolt:github.com/coreos/ [email受保護]:解析go.mod:模塊將其路徑聲明為:go.etcd.io/bbolt `要解決此問題,您可以在go.mod文件中使用替換指令。只需在go.mod的末尾添加以下行:[&& &...
    程式設計 發佈於2025-02-07
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python 射線tracing方法Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a路徑對象表示多邊形。它檢查給定點是否位於定義路徑內。 T...
    程式設計 發佈於2025-02-07

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3