【React】如何高效使用条件渲染

作为一名 React 开发者,我们都经历过这样的时刻:盯着 JSX 代码,纠结于条件渲染,内心涌起一丝挫败感。让我们先看看一些常见的代码片段:

jsx 复制代码
{isVisible && ( <> <Header /> <Content /> </> )} 
{ isLoggedIn ? <UserDashboard /> : <LoginForm /> }

没错,这些代码确实能跑起来,但代价是什么呢?🤔

  1. 过多的括号和嵌套让代码难以阅读。
  2. 嵌套的条件判断?那简直是混乱的开始。
  3. 这样的代码既不优雅,也不直观。

虽然这不是什么致命问题,但它就像鞋里的一粒小石子------虽然小,但时间久了真的会让人抓狂。😫

灵感来源:Solid.js 的优雅解决方案 💡

这时,Solid.js 进入了我的视野。这个框架以其创新的设计思路吸引了众多开发者的目光。其中一个让我眼前一亮的特性,就是它处理条件渲染的优雅方式。

解决方案:引入 Show 组件 🎉

受到 Solid.js 的启发,我决定创建一个 Show 组件,来简化我们的条件渲染逻辑:

jsx 复制代码
interface ShowProps<T> {
	when: T | undefined | null | false; 
	fallback?: React.ReactNode; 
	children: React.ReactNode | ((item: T) => React.ReactNode); 
} 
	
function Show({ when, fallback = null, children }) {
	return when ? children : fallback; 
}

实战对比:改造前后 🔄

1. 基础条件渲染

改造前:

jsx 复制代码
{isLoading && <Spinner />}

改造后:

jsx 复制代码
<Show when={isLoading}>
	<Spinner /> 
</Show>
2. 条件分支渲染

改造前:

jsx 复制代码
{isAdmin ? <AdminPanel /> : <UserPanel /> }

改造后:

jsx 复制代码
<Show 
	when={isAdmin} 
	fallback={<UserPanel />} 
> 
	<AdminPanel /> 
</Show>
3. 复杂条件渲染

改造前:

jsx 复制代码
{isCommentsEnabled && ( <> <CommentsHeader /> {comments.map(comment => ( <CommentItem key={comment.id} {...comment} /> ))} {isLoggedIn && <CommentForm />} </> )}

改造后:

jsx 复制代码
<Show when={isCommentsEnabled}> 
  <CommentsHeader /> 
  {comments.map(comment => ( 
    <CommentItem key={comment.id} {...comment} /> 
  ))} 
  <Show when={isLoggedIn}> 
    <CommentForm /> 
  </Show> 
</Show>
4. 带数据处理的条件渲染

改造前:

jsx 复制代码
{user && ( <div> Welcome, {user.name}! {user.isAdmin && <AdminBadge />} </div> )}

改造后:

jsx 复制代码
<Show when={user}> 
  {(userData) => ( 
    <div> 
      Welcome, {userData.name}! 
      <Show when={userData.isAdmin}> 
        <AdminBadge /> 
      </Show> 
    </div> 
  )} 
</Show>

更进一步:支持异步数据 🚀

既然已经做到这一步了,为什么不更进一步呢?让我们为异步数据添加支持:

jsx 复制代码
const AsyncShow = ({ when, fallback, children }) => { 
  const [isLoading, setIsLoading] = useState(true); 
  const [data, setData] = useState(null); 

  useEffect(() => { 
    Promise.resolve(when).then(result => { 
      setData(result); 
      setIsLoading(false); 
    }); 
  }, [when]); 

  if (isLoading) return fallback; 
  return data ? children : null; 
}; 

// 使用示例
<AsyncShow when={fetchUserData()} fallback={<Loading />} > 
  {user => <UserProfile data={user} />} 
</AsyncShow>

总结:小改动,大影响 🎬

这个简单的组件不仅让我们的代码更干净、更易读,还提升了开发效率。有时候,最小的改进也能带来最大的收益!🌟

记住,在 React 开发的大舞台上,往往是像 Show 这样的"配角"抢走了风头。所以,让这场表演继续吧,愿你的条件渲染永远优雅!

相关推荐
低代码布道师4 小时前
Next.js 16 全栈实战(一):从零打造“教培管家”系统——环境与脚手架搭建
开发语言·javascript·ecmascript
鹏北海-RemHusband4 小时前
从零到一:基于 micro-app 的企业级微前端模板完整实现指南
前端·微服务·架构
LYFlied4 小时前
AI大时代下前端跨端解决方案的现状与演进路径
前端·人工智能
光影少年4 小时前
AI 前端 / 高级前端
前端·人工智能·状态模式
一位搞嵌入式的 genius4 小时前
深入 JavaScript 函数式编程:从基础到实战(含面试题解析)
前端·javascript·函数式
anOnion4 小时前
构建无障碍组件之Alert Dialog Pattern
前端·html·交互设计
choke2335 小时前
[特殊字符] Python 文件与路径操作
java·前端·javascript
云飞云共享云桌面5 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
Deng9452013145 小时前
Vue + Flask 前后端分离项目实战:从零搭建一个完整博客系统
前端·vue.js·flask
威迪斯特5 小时前
Flask:轻量级Web框架的技术本质与工程实践
前端·数据库·后端·python·flask·开发框架·核心架构