首頁 > web前端 > js教程 > 主體

eact Props 損害應用程式效能的錯誤

DDD
發布: 2024-11-21 08:20:14
原創
564 人瀏覽過

eact Props Mistakes That Are Hurting Your App

React 中的 Props 可能感覺很簡單,但處理不當可能會使您的應用程式變得緩慢。隨著時間的推移,在編碼和查看一些 React 專案後,我注意到不斷出現的十個與 props 相關的錯誤。這些問題也可能潛伏在您的程式碼中。

不過別擔心-我們會一起修復它們。讓我們深入研究,讓您的 React 應用程式更快、更有效率!

1} 當只需要特定屬性時停止傳遞整個物件

當您的元件只需要幾個屬性時,將整個物件作為 props 傳遞會導致物件更新時不必要的重新渲染 - 即使您使用的值保持不變。

// Not ideal
function UserProfile({ user }) {
  // Only uses name and email
  return (
    <div>
      <h2>{user.name}</h2>
      <p>{user.email}</p>
    </div>
  );
}

// Better
function UserProfile({ name, email }) {
  return (
    <div>
      <h2>{name}</h2>
      <p>{email}</p>
    </div>
  );
}
登入後複製
登入後複製

只傳遞必要的內容。透過保持 props 的集中和最小化,您將減少元件重新渲染的頻率,從而使您的應用程式的效能顯著提升。

2} 避免在每次渲染時在 Props 中建立新物件

另一個隱藏的罪魁禍首是在 props 中建立內聯物件。當您執行此操作時,每次渲染元件時都會建立新的物件參考。這些新引用會強制子元件重新渲染,即使值相同。

// Not efficient
function ParentComponent() {
  return (
    <ChildComponent 
      styles={{ margin: '20px', padding: '10px' }}
      config={{ theme: 'dark', animate: true }}
    />
  );
}

// Smarter approach
const styles = { margin: '20px', padding: '10px' };
const config = { theme: 'dark', animate: true };

function ParentComponent() {
  return (
    <ChildComponent 
      styles={styles}
      config={config}
    />
  );
}
登入後複製
登入後複製

在元件之外取得物件定義或使用 useMemo 來動態建立物件。這是一個簡單的調整,但它可以顯著減少不必要的渲染並保持一切順利運行。

3} 避免不必要地傳播道具

使用 prop spread (...props) 可能感覺很方便,但它往往弊大於利。它會傳遞您不需要的 props,使您的元件更難調試,甚至可能觸發不必要的重新渲染。

// Inefficient
function Parent() {
  const props = {
    name: 'John',
    age: 30,
    email: 'john@email.com',
    phone: '1234567890',
    address: '123 Street'
  };

  return <UserCard {...props} />;
}

// A better way
function Parent() {
  const props = {
    name: 'John',
    age: 30,
    email: 'john@email.com',
    phone: '1234567890',
    address: '123 Street'
  };

  return <UserCard name={props.name} email={props.email} />;
}
登入後複製
登入後複製

僅指定您需要的 props,您可以使您的元件更清晰、更可預測。這使您的應用程式更快、更容易維護。

4} 永遠記住回呼道具

未記憶的回呼函數可能會悄悄損害表現。每次重新渲染元件時,都會建立一個新的函數實例。這可能會破壞使用 React.memo 的子元件的最佳化或導致不必要的重新渲染。

// Not optimal
function TodoList() {
  const handleClick = (id) => {
    // handle click
  };

  return <TodoItem onClick={handleClick} />;
}

// Optimal approach
function TodoList() {
  const handleClick = useCallback((id) => {
    // handle click
  }, []); // Include dependencies if needed

  return <TodoItem onClick={handleClick} />;
}
登入後複製
登入後複製

將回調屬性傳遞給記憶組件或在 useEffect 中使用它們時,用 useCallback 包裝它們。這確保了穩定的引用並避免不必要的更新。

5} 停止透過多個等級進行 Prop 鑽取

透過多個甚至不使用道具的元件傳遞道具肯定會創建不必要的重新渲染和混亂的程式碼。這稱為道具鑽探,隨著應用程式的成長,它會使您的應用程式更難管理。

// Not ideal
function UserProfile({ user }) {
  // Only uses name and email
  return (
    <div>
      <h2>{user.name}</h2>
      <p>{user.email}</p>
    </div>
  );
}

// Better
function UserProfile({ name, email }) {
  return (
    <div>
      <h2>{name}</h2>
      <p>{email}</p>
    </div>
  );
}
登入後複製
登入後複製

不要將 props 傳遞到每一層,而是使用 React Context 等工具或 Zustand 等函式庫來管理深度嵌套的資料。這種方法可以使您的程式碼更加乾淨並避免不必要的渲染。

6} 不要使用陣列索引作為鍵

使用陣列索引作為鍵可能看起來無害,但它可能會導致微妙的錯誤和效能問題,特別是在項目被重新排序或刪除的清單中。

// Not efficient
function ParentComponent() {
  return (
    <ChildComponent 
      styles={{ margin: '20px', padding: '10px' }}
      config={{ theme: 'dark', animate: true }}
    />
  );
}

// Smarter approach
const styles = { margin: '20px', padding: '10px' };
const config = { theme: 'dark', animate: true };

function ParentComponent() {
  return (
    <ChildComponent 
      styles={styles}
      config={config}
    />
  );
}
登入後複製
登入後複製

總是使用穩定、唯一的識別碼作為鍵。這有助於 React 正確追蹤您的元件,確保順利更新並準確維護狀態。

7}停止傳遞未使用的道具

傳遞不必要的 props 會讓你的元件變得臃腫並觸發本可避免的重新渲染。每個額外的 prop 都會增加開銷,即使它沒有在元件中使用。

// Inefficient
function Parent() {
  const props = {
    name: 'John',
    age: 30,
    email: 'john@email.com',
    phone: '1234567890',
    address: '123 Street'
  };

  return <UserCard {...props} />;
}

// A better way
function Parent() {
  const props = {
    name: 'John',
    age: 30,
    email: 'john@email.com',
    phone: '1234567890',
    address: '123 Street'
  };

  return <UserCard name={props.name} email={props.email} />;
}
登入後複製
登入後複製

定期重構你的元件並刪除任何不必要的 props。更精簡的元件意味著更少的重新渲染和更快的應用程式。

8} 總是使用正確的道具類型

跳過 PropTypes 或 TypeScript 是一個常見錯誤,可能會導致錯誤和執行階段錯誤。這些工具有助於在開發過程中捕獲與 prop 相關的問題,使您的應用程式更加健壯且更易於調試。

// Not optimal
function TodoList() {
  const handleClick = (id) => {
    // handle click
  };

  return <TodoItem onClick={handleClick} />;
}

// Optimal approach
function TodoList() {
  const handleClick = useCallback((id) => {
    // handle click
  }, []); // Include dependencies if needed

  return <TodoItem onClick={handleClick} />;
}
登入後複製
登入後複製

使用 TypeScript 或 PropTypes 不僅可以幫助您及早發現問題,還可以讓您的元件更具可預測性和可維護性。

9} 切勿直接改變 Props

直接更改 props 違反了 React 的不變性原則,常常會導致意外的錯誤和錯過更新。

// Not ideal
function GrandParent({ user }) {
  return <Parent user={user} />;
}

function Parent({ user }) {
  return <Child user={user} />;
}

function Child({ user }) {
  return <span>{user.name}</span>;
}

// Smarter solution
function App() {
  const [user] = useState(userData);

  return (
    <UserContext.Provider value={user}>
      <GrandParent />
    </UserContext.Provider>
  );
}

function Child() {
  const user = useContext(UserContext);
  return <span>{user.name}</span>;
}
登入後複製

透過使用函數或狀態更新來保持 props 不可變。這確保了 React 可以正確追蹤變更並在需要時重新渲染元件。

結論

這些 prop 錯誤看起來很小,但隨著時間的推移,它們累積起來會造成嚴重的效能問題。為了讓你的 React 應用程式順利運作:

  • 僅傳遞組件實際需要的 props。
  • 使用 useCallback 來記憶函數並避免不必要的渲染。
  • 依賴 Context 或 Zustand 等狀態管理工具,而不是鑽孔 props。
  • 永遠不要直接改變 props-總是使用不可變的更新。
  • 使用 TypeScript 或 PropTypes 強制型別安全性並儘早發現錯誤。

幫助您最佳化的工具:

  • React DevTools 效能標籤:找出效能瓶頸。
  • why-did-you-render:自動偵測不必要的渲染。
  • ESLint React Hooks 外掛:確保正確的鉤子使用。
  • TypeScript:新增靜態類型以提高可靠性。

立即解決這些問題,您會發現您的應用程式感覺更快、反應更靈敏且更易於維護。

編碼愉快! !

以上是eact Props 損害應用程式效能的錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板