组件中的条件逻辑与列表渲染 - Conditional Rendering & List Data Rendering

发布于 2022-04-21 12:33:04 字数 2669 浏览 1012 评论 0

简单来说,组件中经常会出现 if-else 这样的渲染逻辑,比如列表长度为0时不渲染组件,比如在一个大组件中,选择性决定是否渲染某个小部分。有了 if-else,就一定要出现 JSX 的 { } 标签,原本顺畅的声明式 UI JSX 语法就难看许多。因此,如前所述,为了保证 React 声明式 UI 代码的编写和阅读能力,我们的原则是,使用尽量少的 JSX 语法来处理组件中的 if 渲染逻辑。

经过考察各种各样的方案,只有下面这种方式是我所能勉强接受的、差强人意的解决方案。已经很难看了。

const NewsItem = ({ text, optionalVideoId }) => (
  <Text>{ text }</Text>
  { !!optionalVideoId && (
    <VideoPlayer id={optionalVideoId} />
  ) }
)

下面这种很清晰,多出来的 if JSX 非但不影响效果,反而让组件「读」起来也很顺畅。从阅读上讲比上面的写法好不少,但上面其实是相对比较复杂的 case,无法用这种手法进行处理。

const Login = ({ isLoggedIn, loginMode }) => {
  if (isLoggedIn) {
    return <Profile loginMode={ loginMode } />
  } 
  return <Login />
}

const Login = ({ isLoggedIn, loginMode }) => {
  return isLoggedIn ? <Profile loginMode={ loginMode } /> : <Login />
}

对于列表渲染,RN 中有 FlatList SectionList 这样内置的类用以渲染列表,但 react 中一般还是需要通过手动的 map 来处理。手动 map 的缺点是太过命令式,需要写一些样板代码,并且最重要的是让 React 的声明式 UI 能力和阅读体验大打折扣。然后我觉得,下面这些常见的逻辑,其实都可以通过封装组件来达到声明式的目的。

  • if 条件满足时渲染
  • 渲染列表
  • 字符串不为空时渲染
<If condition={data.length !== 0}>
  <Data />
</If>
<List data={data} renderItem={({ id, title }) => <div>{id}: {title}</div>} />

卧槽,今天发现这些库干的事情就跟我想的一样啊,用来对付简单逻辑,又获得模板声明式的好处,又可以省去测试并依然有信心。然后复杂逻辑就得益于 Vanilla JS 来处理,简直 React 完美的解决方案:

组件的拆分粒度

项目目录结构划分

  • functional(actions/reducers/selectors/components/containers)
  • duck

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

0 文章
0 评论
84961 人气
更多

推荐作者

已经忘了多久

文章 0 评论 0

15867725375

文章 0 评论 0

LonelySnow

文章 0 评论 0

走过海棠暮

文章 0 评论 0

轻许诺言

文章 0 评论 0

信馬由缰

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文