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

相关推荐
一念永恒@5 分钟前
vue2新增删除
前端·javascript·vue.js
岸边的风23 分钟前
vue中mixin的理解,有那些使用场景?
前端·javascript·vue.js
时间sk38 分钟前
CSS——6. 导入样式
前端·css
玩具工匠1 小时前
字玩FontPlayer开发笔记9 Tauri2打包应用
前端·笔记
椒盐大肥猫1 小时前
vue3运行时执行过程步骤
javascript·vue.js·ecmascript
骆驼Lara1 小时前
Vue3.5 企业级管理系统实战(一):项目初始搭建与配置
前端·vue.js
黑云压城After1 小时前
uniapp web-view调整修改高度设置
前端·javascript·uni-app
问老大1 小时前
uniapp实现在card卡片组件内为图片添加长按保存、识别二维码等功能
前端·javascript·uni-app
她说她一如既往的爱我1 小时前
如何写一个uniapp自定义tarbar导航栏?
前端·vue.js·windows·uni-app
大大艺术家1 小时前
安装vue脚手架出现的一系列问题
前端·javascript·vue.js