国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解React 的幾種條件渲染以及選擇

2024-05-06 15:28:29
字體:
來源:轉載
供稿:網友

對于一個展示頁面來講, 通常有好幾種展示狀態(以列表頁為例):

數據為空, 空頁面 取數據時發生錯誤, 錯誤頁面 數據正常 加載狀態

針對以上三種情況, react渲染列表的時候要正確判斷并渲染出相應的視圖, 也就是條件渲染. 不同于vue的v-if, v-show等框架提供的api, react的條件渲染都是js原生的再加上一點點的hack. 比如react文檔提到的. if/else, && 和三目等等.

當然上面的都是常用的一些方法, 但是也存在著各種問題, 比如條件分支過多的的事時候代碼也會越來越亂. 下面提供幾種具有普適性的方法

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

這三個方法都是官方文檔提到的, 這里就放到一起了, 其實這三種方案都是類似的: 在render生命周期里做相應的判斷. 不過三目和短路運算符可以在jsx行內使用.

if/else

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對應起來

function Render ({ if: cond, children }) {  return cond ? children : null}

上面是簡單的Render組件, 使用起來是這樣的

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里是可以寫變量, 同時立即執行函數也是可以的

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>  ) }}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 兴宁市| 报价| 东至县| 黄石市| 兰西县| 嵊泗县| 密山市| 竹北市| 蒙山县| 龙江县| 梅州市| 永寿县| 浑源县| 司法| 工布江达县| 巩留县| 诸城市| 扎鲁特旗| 江达县| 岗巴县| 温泉县| 开阳县| 乐安县| 旬邑县| 行唐县| 百色市| 恭城| 兴化市| 什邡市| 巩留县| 宜川县| 沧州市| 鄂尔多斯市| 荣昌县| 大渡口区| 怀集县| 黄大仙区| 牟定县| 凤城市| 广东省| 曲阳县|