【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 这样的"配角"抢走了风头。所以,让这场表演继续吧,愿你的条件渲染永远优雅!

相关推荐
jerrywus几秒前
DeepSeek Harness 和 Pi Agent 怎么选?先想想你愿意折腾什么
前端·agent·deepseek
货拉拉技术8 分钟前
一句话叫车:货拉拉小程序 AI 叫车实战
前端·agent·ai编程
yunyi13 分钟前
给桌面客户端做下载加速:从「桶直接公开」到「边缘优先、源站兜底」的三代演进
前端·后端
world781122619 分钟前
【C++】set 和 map
java·前端·c++·set·map
程序猿乐锅21 分钟前
Streamlit 实现 AI 聊天 Agent:角色提示词、流式输出与会话管理
开发语言·前端·笔记·后端·python·学习
niucloud-admin24 分钟前
NIUCLOUD PHP SAAS上门家政使用文档:客户报表
前端·人工智能·ai编程
漫步人生走在路上29 分钟前
外贸B2B行业GEO优化白皮书:从0到1完整落地流程
前端·人工智能·搜索引擎·chatgpt·twitter
程序猿乐锅1 小时前
面向对象练习:图书借阅系统里的封装、抽象类与多态
开发语言·前端·数据库·后端·python·学习·1024程序员节
老木避暑研究所1 小时前
负氧离子数据的采集、清洗与可视化:一套可复用的环境监测数据分析模板
前端·人工智能·数据分析
计算机魔术师1 小时前
AI 推翻了一个当了30年地基的假设,查的人恰好是立论者
前端