重建 React 程式碼就像把一個混亂的廚房變成一個組織良好的烹飪天堂。它是關於在不改變應用程式功能的情況下改進應用程式的結構、可維護性和效能。無論您是在與臃腫的組件還是混亂的狀態邏輯作鬥爭,精心策劃的重構都會將您的程式碼庫轉變為流暢、高效的機器。
本部落格揭示了常見的重構場景,提供了可行的解決方案,並使您能夠釋放 React 應用程式的真正潛力。
我。什麼是重構以及為什麼它很重要?
重構可以在不改變程式碼功能的情況下改進程式碼的結構。這不是為了修復錯誤或添加功能,而是為了讓您的程式碼對人類和機器都更好。
為什麼要重構?
- 可讀性:當程式碼讀起來像一本好小說而不是一個神秘的謎題時,在凌晨 3 點調試程式碼會變得容易得多。
- 可維護性:乾淨的程式碼庫可以節省數小時的入門時間並加快更新速度。
- 效能:更簡潔的程式碼通常意味著更快的載入時間和更流暢的使用者體驗。
? 專業提示:避免過早最佳化。當有明確的需求時進行重構,例如改善開發人員體驗或解決緩慢的渲染問題。
二.嗅出程式碼味道
程式碼異味是低效率或複雜性的微妙訊號。它們不是錯誤,但它們表明了需要改進的地方。
常見的 React 程式碼味道
-
臃腫的組件
- 問題:單一元件處理太多職責,例如取得資料、渲染和處理事件。
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <productitem key="{item.id}" item="{item}"></productitem>)} <button onclick="{handleAddToCart}">Add to Cart</button> </div> ); }
- 解決方案: 將其分解為更小的、更集中的組件。
function ProductPage() { return ( <div> <productlist></productlist> <cartbutton></cartbutton> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <productitem key="{item.id}" item="{item}"></productitem>); } function CartButton() { const handleAddToCart = () => { ... }; return <button onclick="{handleAddToCart}">Add to Cart</button>; }
-
支柱鑽井
- 問題: 透過多層元件傳遞 props。
<app> <productlist product="{product}"></productlist> </app>
- 解1:使用組合。
<productlist> <productitem product="{product}"></productitem> </productlist>
- 解決方案 2: 使用上下文。
const ProductContext = React.createContext(); function App() { const [product, setProduct] = useState({ id: 1, name: 'Example Product' }); // Example state return ( <productcontext.provider value="{product}"> <productlist></productlist> </productcontext.provider> ); } function ProductList() { const product = useContext(ProductContext); return <productitem product="{product}"></productitem>; }
-
嵌套三元地獄
- 問題: 使用巢狀三元組的複雜條件渲染。
return condition1 ? a : condition2 ? b : condition3 ? c : d;
- 解: 使用輔助函式或 switch 語句進行重構。
function renderContent(condition) { switch (condition) { case 1: return a; case 2: return b; case 3: return c; default: return d; } } return renderContent(condition);
-
重複邏輯
- 問題:跨組件重複相同的邏輯。
function calculateTotal(cart) { return cart.reduce((total, item) => total + item.price, 0); }
- 解決方案: 將共用邏輯移至可重複使用公用程式或自訂掛鉤。
function calculateTotalPrice(cart) { return cart.reduce((total, item) => total + item.price, 0); } function useTotalPrice(cart) { return useMemo(() => calculateTotalPrice(cart), [cart]); }
-
過度狀態
- 問題:直接管理派生狀態。
const [isLoggedIn, setIsLoggedIn] = useState(user !== null);
- 解: 使用衍生狀態取代。
const isLoggedIn = !!user; // Converts 'user' to boolean
三.簡化狀態管理
狀態管理很重要,但很快就會變得混亂。以下是簡化方法:
派生狀態:計算,不儲存
- 問題:儲存冗餘狀態。
- 解:直接從來源計算派生值。
const [cartItems, setCartItems] = useState([]); const totalPrice = cartItems.reduce((total, item) => total + item.price, 0);
使用 useReducer 處理複雜狀態
- 問題:多個相互依賴的狀態。
- 解決方案:使用useReducer。
const initialState = { count: 0 }; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; default: return state; } } const [state, dispatch] = useReducer(reducer, initialState);
狀態託管
- 問題:用於本地資料的全域狀態。
- 解:將狀態移近所需的位置。
// Before: function App() { const [filter, setFilter] = useState(''); return <productlist filter="{filter}" onfilterchange="{setFilter}"></productlist>; } // After: function ProductList() { const [filter, setFilter] = useState(''); return <filterinput value="{filter}" onchange="{setFilter}"></filterinput>; }
四。重構組件
組件應該只做一項工作並且做得很好。例如:
每個組件一個作業
function MemberCard({ member }) { return ( <div> <summary member="{member}"></summary> <seemore details="{member.details}"></seemore> </div> ); }
V.效能最佳化
反應分析器
使用分析器來辨識瓶頸。在“Profiler”下的開發者工具中存取它。
記憶
最佳化昂貴的計算:
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <productitem key="{item.id}" item="{item}"></productitem>)} <button onclick="{handleAddToCart}">Add to Cart</button> </div> ); }
注意:避免過度使用頻繁更新的依賴項的記憶。
六。重構可測試性
編寫以使用者為中心的測驗:
function ProductPage() { return ( <div> <productlist></productlist> <cartbutton></cartbutton> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <productitem key="{item.id}" item="{item}"></productitem>); } function CartButton() { const handleAddToCart = () => { ... }; return <button onclick="{handleAddToCart}">Add to Cart</button>; }
七。可維護性的最後潤飾
- 依功能組織:
<app> <productlist product="{product}"></productlist> </app>
- 使用絕對導入:
<productlist> <productitem product="{product}"></productitem> </productlist>
八。備忘單
Category | Tip |
---|---|
Code Smells | Split bloated components; avoid prop drilling. |
State Management | Use derived state; colocate state. |
Performance | Use Profiler; optimize Context values. |
Testing | Test behavior, not implementation details. |
提示
以上是重構 React:馴服混亂,一次一個元件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript核心數據類型在瀏覽器和Node.js中一致,但處理方式和額外類型有所不同。 1)全局對像在瀏覽器中為window,在Node.js中為global。 2)Node.js獨有Buffer對象,用於處理二進制數據。 3)性能和時間處理在兩者間也有差異,需根據環境調整代碼。

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

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