2024-01-08
【React 新手村】如何優雅地控制頁面組件

原文發表於 Medium。

故事發生在一個前端工程師小明的日常工作中。小明正在開發一個電子商務網站,他的任務是在商品列表頁面中顯示每個商品的價格,但問題是,除了商品價格會浮動之外,有時還會碰到商品未定價的問題,那該如何解決呢?
小明的初步想法
小明的每個商品組件如下所示:
import React from 'react';
const ProductCard = ({ product }) => {
return (
<div className="product-card">
<h3>{product.name}</h3>
<p>{/* 小明需要在這裡顯示商品價格 */}</p>
<button>加入購物車</button>
</div>
);
};
export default ProductCard;
他想要在 <p> 標籤中顯示商品的價格,但價格卻有可能是空值,這個空值若出現在頁面上,小則頁面崩潰,大則造成顧客的誤會,因此小明需要一個方式來處理這種情況。
使用兩種渲染方案
小明在第一時間想要這樣安排他的渲染模式:
import React from 'react';
const ProductCard = ({ product }) => {
if(product.price){
return (
<div className="product-card">
<h3>{product.name}</h3>
<p>{product.price}</p>
<button>加入購物車</button>
</div>
)
}
else if (!product.price){
<div className="product-card">
<h3>{product.name}</h3>
<p>暫時無法取得商品價格</p>
<button>加入購物車</button>
</div>
}
};
export default ProductCard;
這樣的處理方式很棒,但其實還可以更好。尤其是看到有好多重複的程式碼,這或許是我們可以避免的重複工。
使用三元運算子:
為了更加簡潔的程式碼,小明最終決定使用三元運算子,如此一來就可以根據價格是否存在,分別顯示不同的內容:
import React from 'react';
const ProductCard = ({ product }) => {
return (
<div className="product-card">
<h3>{product.name}</h3>
{/* 使用三元運算子處理商品價格顯示 */}
<p>{product.price ? `$${product.price}` : '暫時無法取得商品價格'}</p>
<button>加入購物車</button>
</div>
);
};
export default ProductCard;
這邊的邏輯就變成:當商品價格存在時,顯示 $ 加上價格;當價格不存在時,顯示 『暫時無法取得商品價格』。如此一來是不是就簡潔得多了呢?
使用三元運算子的好處可以歸結為下列兩類:
- 條件渲染:三元運算子允許小明更加優雅地根據條件顯示不同的內容,尤其是在處理可能為空的數據時非常有用。
2. 簡潔:使用三元運算子的代碼相對簡潔,能夠在一行中處理條件判斷,而不需要撰寫完整的 if-else 敘述。
這次事件讓小明更好地理解了三元運算子在 React 中的應用,他發現它是一個簡單而強大的工具,能夠有效處理 UI 中的條件邏輯,簡潔又不喪失程式碼的可讀性。
Bonus: 更常使用的運用案例
三元運算子在React的運用上不僅僅是字串的顯示,它甚至可以操控組件的出現與否:
import React from 'react';
import LoginPage from "./components/LoginPage.jsx"
import SignupPage from "./components/Signup.jsx"
const App = () => {
const [isSignup, setIsSignup] = useState(false)
return (
<div className="Main">
{/*若狀態isSignup為true則渲染<LoginPage/>,反之則為<SignupPage/>*/}
{ isSignup ? <LoginPage/> : <SignupPage/> }
</div>
);
};
export default App;
如上方程式碼的操作方式,在很多React App中大量使用,舉凡換頁、選項設定頁面等等皆可以參照這樣的方式,可以說是非常好用。(以下我夢到的:其他框架的使用者,例如Vue,非常不喜歡這個使用三元運算子來控制組件渲染的手法,但我超愛!)
最後祝大家天天有coding,天天有成長。我是一個半路出家卻把coding當作興趣,且不斷鑽研技巧的開發者,希望有朝一日能成為全然獨當一面的技術大神。