当前位置: 首页 > article >正文

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

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

{isVisible && ( <> <Header /> <Content /> </> )} 
{ isLoggedIn ? <UserDashboard /> : <LoginForm /> }

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

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

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

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

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

解决方案:引入 Show 组件 🎉

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

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. 基础条件渲染

改造前:

{isLoading && <Spinner />}

改造后:

<Show when={isLoading}>
	<Spinner /> 
</Show>
2. 条件分支渲染

改造前:

{isAdmin ? <AdminPanel /> : <UserPanel /> }

改造后:

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

改造前:

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

改造后:

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

改造前:

{user && ( <div> Welcome, {user.name}! {user.isAdmin && <AdminBadge />} </div> )}

改造后:

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

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

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

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


http://www.kler.cn/a/470712.html

相关文章:

  • asp.net core中的 Cookie 和 Session
  • 数据传送类指令
  • 深度解析与实践:HTTP 协议
  • Spring AMQP ----注解篇
  • Java中的CAS操作是什么?它如何实现无锁编程?
  • linux系统(ubuntu,uos等)连接鸿蒙next(mate60)设备
  • 使用C++对SQLite3数据库进行增、删、改、查操作实例
  • 2024 华为开发者大会介绍(附大会PPT下载)
  • PyTorch 自动混合精度AMP Grad Scaler 源码解析:_unscale_grads_ 与 unscale_ 函数
  • 【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
  • Excel 技巧02 - 如何批量输入百分号 (★),如何输入百分号并指定小数位数,如何批量删除百分号,如何批量删除小数最后的0?
  • iOS - Tagged Pointer
  • 使用vue项目中,使用webpack模板和直接用vue.config来配置相关插件 区别是什么,具体有哪些提现呢
  • Oracle数据库如何找到 Top Hard Parsing SQL 语句?
  • 基于Django运维系统实现AWS Route 53管理
  • SDAE的介绍
  • 路由器的转发表
  • 【Python】论文长截图、页面分割、水印去除、整合PDF
  • openwrt 清缓存命令行
  • OSPF - 影响OSPF邻居建立的因素
  • [python3]Excel解析库-openpyxl
  • Python----Matplotlib数据可视化
  • Springboot应急安全学习平台k4u90
  • 索引(MySQL)
  • 信息学奥赛一本通:1311:【例2.5】求逆序对
  • 矩阵Matrix(POJ2155)