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

相关推荐
WeiXiao_Hyy24 分钟前
成为 Top 1% 的工程师
java·开发语言·javascript·经验分享·后端
吃杠碰小鸡41 分钟前
高中数学-数列-导数证明
前端·数学·算法
kingwebo'sZone1 小时前
C#使用Aspose.Words把 word转成图片
前端·c#·word
xjt_09011 小时前
基于 Vue 3 构建企业级 Web Components 组件库
前端·javascript·vue.js
我是伪码农1 小时前
Vue 2.3
前端·javascript·vue.js
夜郎king2 小时前
HTML5 SVG 实现日出日落动画与实时天气可视化
前端·html5·svg 日出日落
辰风沐阳2 小时前
JavaScript 的宏任务和微任务
javascript
夏幻灵3 小时前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星3 小时前
javascript之二重循环练习
开发语言·javascript·数据库
Mr Xu_3 小时前
Vue 3 中 watch 的使用详解:监听响应式数据变化的利器
前端·javascript·vue.js