详解React 的几种条件渲染以及选择

对于一个展示页面来讲, 通常有好几种展示状态(以列表页为例):

  • 数据为空, 空页面
  • 取数据时发生错误, 错误页面
  • 数据正常
  • 加载状态

针对以上三种情况, react渲染列表的时候要正确判断并渲染出相应的视图, 也就是条件渲染. 不同于vue的v-if, v-show等框架提供的api, react的条件渲染都是js原生的再加上一点点的hack. 比如react文档提到的. if/else, && 和三目等等.

当然上面的都是常用的一些方法, 但是也存在着各种问题, 比如条件分支过多的的事时候代码也会越来越乱. 下面提供几种具有普适性的方法

if/else, 三目以及 短路运算符

这三个方法都是官方文档提到的, 这里就放到一起了, 其实这三种方案都是类似的: 在render生命周期里做相应的判断. 不过三目和短路运算符可以在jsx行内使用.

if/else

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

class List extends Component {

 static propTypes = {

  status: PropTypes.oneOf([‘loading‘, ‘error‘, ‘success‘, ‘empty‘])

 }

 

 render () {

  const { status } = this.props

  if (status === ‘loading‘) {

   return <div>

    加载状态

   </div>

  }

  

  if (status === ‘error‘) {

   return <div>

    错误状态

   </div>

  }

  if (status === ‘success‘) {

   return <div>

    成功状态

   </div>

  }

  if (status === ‘empty‘) {

   return <div>

    空状态

   </div>

  }

 }

}

可以看到这种写法胜在清楚明了, 但是如果判断分支越来越多代码无可避免的会非常冗余, 同时复用性也堪忧.

Render(IF)组件

这里的render当然不是生命周期里的render, 我们可以跟vue里的v-if对应起来

?


1

2

3

function Render ({ if: cond, children }) {

  return cond ? children : null

}

上面是简单的Render组件, 使用起来是这样的

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

class List extends Component {

  static propTypes = {

    status: PropTypes.oneOf([‘loading‘, ‘error‘, ‘success‘, ‘empty‘])

  }

  

 render () {

  const { status } = this.props

  return (

   <div>

    <Render if={status === ‘loading‘} >

     加载状态

    </Render>

    <Render if={status === ‘error‘} >

     错误状态

    </Render>

    <Render if={status === ‘success‘} >

     成功状态

    </Render>

    <Render if={status === ‘empty‘} >

     空状态

    </Render>

   </div>

  )

  }

}

相比使用在render里使用大量的if/else 上面的写法无疑更加清楚明了了. 如果所有列表业务组件统一起来, 状态保持一致, 我们可以做更高层次的抽象, 把其他状态都抽象到一个高阶函数之中, 我们写代码的时候只要确保success的状态能正确渲染即可

立即执行函数

jsx里是可以写变量, 同时立即执行函数也是可以的

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

class List extends Component {

 static propTypes = {

   status: PropTypes.oneOf([‘loading‘, ‘error‘, ‘success‘, ‘empty‘])

 }

 

 render () {

  const { status } = this.props

  return (

   <div>

    {(() => {

     switch (status) {

      case ‘loading‘:

       return <div>加载状态</div>

      

      case ‘error‘:

       return <div>错误状态</div>

      

      case ‘success‘:

       return <div>成功状态</div>

      

      case ‘empty‘:

       return <div>空状态</div>

     }

    })()}

   </div>

  )

 }

}

立即函数的复用显然不太现实, 所以立即函数的适用场景是那种相对比较复杂但无法复用的组件

高阶组件

对于高阶组件的概念就不做赘述了, 我们把条件渲染的逻辑放到高阶组件中, 除了逻辑的抽象外, 也可以提高组件的复用率.

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

const withList = WrappedComponent => {

 return class PP extends Component {

  render() {

   const { status } = this.props

   switch (status) {

    case ‘loading‘:

     return <div>加载状态</div>

    

    case ‘error‘:

     return <div>错误状态</div>

    

    case ‘success‘:

     return <WrappedComponent {...this.props}/>

    

    case ‘empty‘:

     return <div>空状态</div>

   }

  }

 }

}

如果我们可以保证所有列表的props一致(也就是都使用status判断状态), 我们完全可以专注的写status为success的状态:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

@withList

class List extends Component {

 static propTypes = {

  status: PropTypes.oneOf([‘loading‘, ‘error‘, ‘success‘, ‘empty‘])

 }

 

 render () {

  return (

   <div>

    成功页面

   </div>

  )

 }

}

其次我们可以把加载, 错误, 以及空状态统一抽成组件, 对于提高组件的复用率无疑可以起很大作用。

     
HTML5 移动Web App阅读器
React Native视频教程电商项目实战教学 
Reactjs教程从入门到精通 
7天搞定Node.js微信公众号开发 
JavaScript网页游戏开发实战视频教程
捷训Node.js视频教程
React.js入门与实战 开发适配PC端及移动端新闻头条平台
Ionic实战  ...2
WebApp 书城整站开发
Vue 2.0高级实战开发移动端音乐WebApp
React高级实战 - 打造大众点评 WebApp  ...2
快速开发轻量级 App 基于地理位置定位
Vue.JS多套精华视频教程合集 Web界面框架Vue.JS 五套中文+英文视频教程+资料 
分享自己私藏的React Native React基础 React路由 ECMAScript (es6) 等视频教程合集 
前端与移动开发精编升级版视频教程 全新升级 四大模块轻松入门学习前端与移动开发 
2017最新JavaScript视频教程 后盾网JavaScript全新版培训视频教程64讲 
HTML5网页设计经典入门级视频教程 HTML5网页设计初窥系列课程 HTML5视频教程 
JQuery入门宝典培训教程 后盾网全新Web开发系列之JQuery教程 2017最新版 
2017年最新CSS3学习视频教程 33讲完整版 后盾网CSS3视频教程 2017年最新版 
2017最新AngularJS开发宝典视频教程 后盾网AngularJS培训视频教程 后盾网2017 

下一页 ?

原文地址:https://www.cnblogs.com/xanthedsf/p/10163956.html

时间: 2024-08-29 17:18:58

详解React 的几种条件渲染以及选择的相关文章

093:QuerySet&#160;API详解-QuerySet转换为SQL的条件

QuerySet API详解-QuerySet转换为SQL的条件: 生成一个 QuerySet 对象并不会马上转换为 SQL 语句去执行.比如我们获取 Book 表下所有的图书: books = Book.objects.all() print(connection.queries) 我们可以看到在打印 connection.quries 的时候打印的是一个空的列表.说明上面的 QuerySet 并没有真正的执行. 在以下情况下 QuerySet 会被转换为 SQL 语句执行:1.迭代:在遍历

轻松搞定高并发:详解Redis的五种数据类型及应用场景分析!

一.Redis基本概念介绍和特性 1.1 Redis基本概念介绍 1.Redis是远程的,有客户端和服务端,我们一般说的是服务端: 2.Redis是基于内存的,所以比基于硬盘的MySQL要快很多,但非常吃内存 3.Redis是非关系型数据库.本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不需要. 1.2 Redis 和 Memcached比较 Redis数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的

React:Conditional Rendering(条件渲染)

就像JS中常常会根据条件(比如if/else.switch)返回不同的值,React中也可以根据组件的状态或其他参考条件返回不同的React Element. 比如根据用户是否登陆渲染对应的UI面板. 1 class LoginControl extends React.Component { 2 constructor(props) { 3 super(props); 4 this.handleLoginClick = this.handleLoginClick.bind(this); 5 t

Java开发中的23种设计模式详解之三:11种行为型模式

本章是关于设计模式的最后一讲,会讲到第三种设计模式--行为型模式,共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式.这段时间一直在写关于设计模式的东西,终于写到一半了,写博文是个很费时间的东西,因为我得为读者负责,不论是图还是代码还是表述,都希望能尽量写清楚,以便读者理解,我想不论是我还是读者,都希望看到高质量的博文出来,从我本人出发,我会一直坚持下去,不断更新,源源动力来自于读者朋友们的不断支持,我会尽自己

详解Oracle的几种分页查询语句

分页查询格式: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT * FROM TABLE_NAME) A  WHERE ROWNUM <= 40 ) WHERE RN >= 21 其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句.ROWNUM <= 40和RN >= 21控制分页查询的每页的范围. 上面给出的这个分页查询语句,在大多数情况拥有较高的效率.分页的目的就是控制输出结果集

并发编程学习总结(二) : 详解 线程的6种不同状态

(一) 线程状态: 我们先讨论一下线程的几种状态: java中Thrad.State总共有6中状态: (1)New (新创建) (2)Runnable (可运行) (3)Bolcked (被阻塞) (4)Waiting (等待) (5)Timed Waiting (计时等待) (6)Terminated (被终止) 这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析和代码实例. 下面我们分别看一下线程的这6中状态分别出现在什么情况下. (1)New (新创建) 当我们执行new T

详解listview的四种适配器模式

ListView是Android开发中比较常用的一个组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示.比如说我们手机里的通讯录就使用到了ListView显示联系人信息.ListView同时也是所有Android UI控件中最为麻烦的控件,之所以麻烦就是因为它的各种的适配器特别麻烦. 创建ListView有两种方式: 1.直接创建ListView 2.让Activity继承ListActivity 列表的显示需要三个元素: 1.ListVeiw :用来展示列表的View. 2.适

详解location.href几种用法的区别【JS跳转】

一:提出问题 使用js的同学一定知道js的location.href的作用是什么,但是在js中关于location.href的用法究竟有哪几种,究竟有哪些区别,估计很多人都不知道了. 二:常见的几种形式 目前在开发中经常要用到的几种形式有: 1 self.location.href; 2 window.location.href; 3 this.location.href; 4 location.href; 5 parent.location.href; 6 top.location.href;

详解PHP的3种框架

PHP的三种框架都很适合用来创建Web2.0应用程序,但每种框架的使用目的有所不同.我们看看它们具有哪些功能,以及它们之间的较量,希望这对大家的PHP框架学习有所帮助. 模板引擎 模板引擎减少开发人员的工作量,它为写前端代码提供更好的功能.模板引擎提供了诸如自动HTML转义和过滤功能,并填写由原生PHP留下的空白. Symfony Twig 模板系统 Twig是PHP的现代模板系统.Symfony利用其优势,使开发人员能够编写干净.简洁的代码,而且它比原生PHP可以做得更多.例如,原生PHP写的