重构 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中文网其他相关文章!