function Greeting({ isLoggedIn }) {
if (isLoggedIn) {
return ;
}
return ;
}
**元素变量**:
function LoginControl() {
const [isLoggedIn, setIsLoggedIn] = useState(false);
let button;
if (isLoggedIn) {
button = ;
} else {
button = ;
}
return (
{button}
);
}
===== 8.2 三元运算符 =====
对于简单的条件渲染,可以使用三元运算符:
function Greeting({ isLoggedIn }) {
return (
{isLoggedIn ? : }
);
}
// 内联条件
function Message({ unreadCount }) {
return (
你好!
{unreadCount > 0 ? 你有 {unreadCount} 条未读消息。
: null}
);
}
===== 8.3 逻辑与运算符 =====
当条件为 true 时渲染元素,否则不渲染任何内容:
function Mailbox({ unreadMessages }) {
return (
你好!
{unreadMessages.length > 0 && (
你有 {unreadMessages.length} 条未读消息。
)}
);
}
**注意 0 的问题**:
// 如果 count 为 0,会显示 "0" 在页面上
{count && 有消息}
// 正确做法
{count > 0 && 有消息}
{!!count && 有消息}
{Boolean(count) && 有消息}
===== 8.4 阻止组件渲染 =====
让组件返回 null 可以阻止它渲染:
function WarningBanner({ warn }) {
if (!warn) {
return null;
}
return (
警告!
);
}
**注意事项**:
* 返回 null 不会影响组件的生命周期方法
* componentDidUpdate 仍然会被调用
===== 8.5 复杂条件渲染 =====
**switch 语句**:
function StatusMessage({ status }) {
switch (status) {
case 'loading':
return ;
case 'success':
return ;
case 'error':
return ;
default:
return null;
}
}
**对象映射**:
const statusComponents = {
loading: LoadingSpinner,
success: SuccessMessage,
error: ErrorMessage
};
function StatusMessage({ status }) {
const Component = statusComponents[status];
return Component ? : null;
}
**策略模式**:
function Page({ userType }) {
const pages = {
admin: AdminPage,
user: UserPage,
guest: GuestPage
};
const Component = pages[userType] || GuestPage;
return ;
}
===== 8.6 权限控制组件 =====
function Permission({ children, role, allowedRoles }) {
if (!allowedRoles.includes(role)) {
return ;
}
return children;
}
// 使用
function AdminPanel() {
return (
);
}
===== 8.7 多条件渲染 =====
**嵌套条件**:
function ComplexCondition({ isLoggedIn, isAdmin, hasPermission }) {
if (!isLoggedIn) {
return ;
}
if (isAdmin) {
return ;
}
if (hasPermission) {
return ;
}
return ;
}
**多分支三元运算符**:
function Status({ code }) {
return (
{code === 200 ? :
code === 404 ? :
code === 500 ? :
}
);
}
===== 8.8 性能优化 =====
**避免不必要的渲染**:
// 不推荐:每次都计算
function List({ items, filter }) {
return (
{items.filter(item => item.type === filter).map(item => (
))}
);
}
// 推荐:使用 useMemo
function List({ items, filter }) {
const filteredItems = useMemo(() =>
items.filter(item => item.type === filter),
[items, filter]
);
return (
{filteredItems.map(item => (
))}
);
}
===== 8.9 总结 =====
本章介绍了条件渲染的各种方法:
* if 语句
* 三元运算符
* 逻辑与运算符
* 阻止组件渲染(return null)
* 复杂条件处理
* 权限控制模式
选择合适的条件渲染方式可以让代码更清晰、更易维护。