重建 React 程式碼就像把一個混亂的廚房變成一個組織良好的烹飪天堂。它是關於在不改變應用程式功能的情況下改進應用程式的結構、可維護性和效能。無論您是在與臃腫的組件還是混亂的狀態邏輯作鬥爭,精心策劃的重構都會將您的程式碼庫轉變為流暢、高效的機器。
本部落格揭示了常見的重構場景,提供了可行的解決方案,並使您能夠釋放 React 應用程式的真正潛力。
重構可以在不改變程式碼功能的情況下改進程式碼的結構。這不是為了修復錯誤或添加功能,而是為了讓您的程式碼對人類和機器都更好。
? 專業提示:避免過早最佳化。當有明確的需求時進行重構,例如改善開發人員體驗或解決緩慢的渲染問題。
程式碼異味是低效率或複雜性的微妙訊號。它們不是錯誤,但它們表明了需要改進的地方。
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <ProductItem key={item.id} item={item} />)} <button onClick={handleAddToCart}>Add to Cart</button> </div> ); }
function ProductPage() { return ( <div> <ProductList /> <CartButton /> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <ProductItem key={item.id} item={item} />); } function CartButton() { const handleAddToCart = () => { ... }; return <button onClick={handleAddToCart}>Add to Cart</button>; }
<App> <ProductList product={product} /> </App>
<ProductList> <ProductItem product={product} /> </ProductList>
const ProductContext = React.createContext(); function App() { const [product, setProduct] = useState({ id: 1, name: 'Example Product' }); // Example state return ( <ProductContext.Provider value={product}> <ProductList /> </ProductContext.Provider> ); } function ProductList() { const product = useContext(ProductContext); return <ProductItem product={product} />; }
return condition1 ? a : condition2 ? b : condition3 ? c : d;
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);
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} />; } // After: function ProductList() { const [filter, setFilter] = useState(''); return <FilterInput value={filter} onChange={setFilter} />; }
組件應該只做一項工作並且做得很好。例如:
function MemberCard({ member }) { return ( <div> <Summary member={member} /> <SeeMore details={member.details} /> </div> ); }
使用分析器來辨識瓶頸。在“Profiler”下的開發者工具中存取它。
最佳化昂貴的計算:
function ProductPage() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); const handleAddToCart = () => { ... }; return ( <div> {data.map(item => <ProductItem key={item.id} item={item} />)} <button onClick={handleAddToCart}>Add to Cart</button> </div> ); }
注意:避免過度使用頻繁更新的依賴項的記憶。
編寫以使用者為中心的測驗:
function ProductPage() { return ( <div> <ProductList /> <CartButton /> </div> ); } function ProductList() { const [data, setData] = useState([]); useEffect(() => fetchData(), []); return data.map(item => <ProductItem key={item.id} item={item} />); } function CartButton() { const handleAddToCart = () => { ... }; return <button onClick={handleAddToCart}>Add to Cart</button>; }
<App> <ProductList product={product} /> </App>
<ProductList> <ProductItem product={product} /> </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中文網其他相關文章!