最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談React碰到v-if

 更新時間:2018年11月04日 08:41:18   作者:而立  
這篇文章主要介紹了淺談React碰到v-if,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近在重構(gòu)公司老項目,由于本人以前的技術(shù)棧是vue, 換工作后發(fā)現(xiàn)現(xiàn)在公司的技術(shù)棧是react, 所以重構(gòu)的過程是及其痛苦。加之項目又是幾年前的老項目,不敢大改,比葫蘆畫瓢比比皆是。本文就介紹下遇到的一個常用的痛點。歡迎大佬指正。

廢話不多說,直接上一段代碼。

import React from 'react'

const App = () => {
 const record = {
  toKe: true, // 貝殼首頁
  toSecondHand: true, // 二手房
  toFang: true, // 新房
 }
 return (
  <div style={{width: 600, margin: '50px auto'}}>
   <ul>
    <li>
     <h3>react常規(guī)寫法</h3>
     {
      record.toKe
      ? <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a>
      : null
     }
     {
      record.toSecondHand
      ? <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a>
      : null
     }
     {
      record.toFang
      ? <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a>
      : null
     }
    </li>
   </ul>
  </div>
 )
}
export default App

如上述代碼,我們在項目中會遇到很多這樣的寫法, 細(xì)看一下沒什么問題,可是當(dāng)在重構(gòu)老項目的時候,你會發(fā)現(xiàn)這個代碼結(jié)構(gòu)是多么痛苦,特別是如下的結(jié)構(gòu)。

{
  record.toFang && record.toKe && record.toSecondHand
  && <div>
    <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a>
    <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a>
    <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a>
  </div>
}

雖然代碼邏輯沒問題,但人生就是這樣,有時候出場順序真的很重要。突然就想起vue的v-if了。
沒錯,回歸主題,就是:react中模擬vuev-if

先上代碼

import React from 'react'
import Hidden from './Hidden'
const App = () => {
 const record = {
  toKe: true, // 貝殼首頁
  toSecondHand: true, // 二手房
  toFang: true, // 新房
 }
 return (
  <div style={{width: 600, margin: '50px auto'}}>
   <ul>
    <li>
     <h3>react模擬實現(xiàn)vue中v-if指令</h3>
     <Hidden visible={record.toKe} tag='span'>
      <a  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a>
     </Hidden>
     <Hidden visible={record.toSecondHand} tag='span' style={{padding: 20}}>
      <a  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a>
     </Hidden>
     <Hidden visible={record.toFang} tag='p'>
      <a  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a>
     </Hidden>
    </li>
   </ul>
  </div>
 )
}
export default App

簡單就是封裝Hidden組件,通過visible去控制是否渲染。

相信聰明的你一定知道怎么去封裝Hidden

筆者剛開始是這么寫的

import React, { Component } from 'react'

export default class Hidden extends Component {
 render() {
  const { visible, children } = this.props
  const content = visible ? children : null
  return (
   <div>
    { content }
   </div>
  )
 }
}

如此簡單,但筆者審查元素的時候發(fā)現(xiàn),每個Hidden下的children莫名被嵌套了一層div

如下

原來的橫著排列的元素,一下子豎著排列了。這可不太好,本來給我套個div,我都可以勉強(qiáng)接收,現(xiàn)在連我布局都給我變了。
怎么辦?筆者突然想到使用vue-router中的router-link時,標(biāo)簽是可以通過tag去替換默認(rèn)標(biāo)簽的。

那我們再給它個tag唄,連帶自定義屬性。

import React, { Component } from 'react'

export default class Hidden extends Component {
 render() {
  const { visible, children, tag = 'div', ...rest } = this.props
  const content = visible ? children : null
  return (
   React.createElement(tag, rest, content)
  )
  // return (
  // 嘗試用這種方法去實現(xiàn),發(fā)現(xiàn)不符合react的規(guī)則,所以使用最原始的渲染方法
  // React.createElement
  // `<`${tag}`>` + { content } + `</`${tag}`>` 
  // )
 }
}

問題:筆者的初衷是模擬vue的v-if, 所以對傳入的children并沒做太多處理,不建議做多做封裝。有興趣的同學(xué)可以自己玩。

{
  record.toFang && record.toKe && record.toSecondHand
  && <span>
    <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a>
    <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a>
    <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a>
  </span>
}
<Hidden 
  visible={record.toFang && record.toKe && record.toSecondHand} 
  tag='span'>
  a  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a>
  <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a>
  <a style={{padding: 20}}  rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a>
</Hidden>

其實感覺也沒多大用處hhhh

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • React this.setState方法使用原理分析介紹

    React this.setState方法使用原理分析介紹

    我們知道,在React中沒有像Vue那種數(shù)據(jù)雙向綁定的效果。而this.setState方法就是用來對數(shù)據(jù)進(jìn)行更改的。而通過this.setState方法更改的數(shù)據(jù),會讓組件的render重新渲染,并且刷新數(shù)據(jù)
    2022-09-09
  • 詳解操作虛擬dom模擬react視圖渲染

    詳解操作虛擬dom模擬react視圖渲染

    這篇文章主要介紹了詳解操作虛擬dom模擬react視圖渲染,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • React?Native實現(xiàn)Toast輕提示和loading效果

    React?Native實現(xiàn)Toast輕提示和loading效果

    這篇文章主要介紹了React Native實現(xiàn)Toast輕提示和loading效果,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • React捕獲并處理異常的方式

    React捕獲并處理異常的方式

    這篇文章主要給大家介紹了React優(yōu)雅的捕獲并處理渲染異常方式,文章通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-11-11
  • React-router?v6在Class組件和非組件代碼中的正確使用

    React-router?v6在Class組件和非組件代碼中的正確使用

    這篇文章主要介紹了React-router?v6在Class組件和非組件代碼中的正確使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • react自定義實現(xiàn)狀態(tài)管理詳解

    react自定義實現(xiàn)狀態(tài)管理詳解

    這篇文章主要為大家詳細(xì)介紹了react如何自定義實現(xiàn)狀態(tài)管理,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • React.js綁定this的5種方法(小結(jié))

    React.js綁定this的5種方法(小結(jié))

    this在javascript中已經(jīng)相當(dāng)靈活,這篇文章主要介紹了React.js綁定this的5種方法(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • React應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析

    React應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析

    這篇文章主要為大家介紹了React 應(yīng)用框架Dva數(shù)據(jù)流向原理總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Ant Design組件庫的使用教程

    Ant Design組件庫的使用教程

    AntDesign ,簡稱antd是基于 Ant Design 設(shè)計體系的 React UI 組件庫,主要用于研發(fā)企業(yè)級中后臺產(chǎn)品,這篇文章主要介紹了Ant Design組件庫的使用教程,需要的朋友可以參考下
    2023-12-12
  • 關(guān)于React Native使用axios進(jìn)行網(wǎng)絡(luò)請求的方法

    關(guān)于React Native使用axios進(jìn)行網(wǎng)絡(luò)請求的方法

    axios是一個基于Promise的Http網(wǎng)絡(luò)庫,可運(yùn)行在瀏覽器端和Node.js中,Vue應(yīng)用的網(wǎng)絡(luò)請求基本都是使用它完成的。這篇文章主要介紹了React Native使用axios進(jìn)行網(wǎng)絡(luò)請求,需要的朋友可以參考下
    2021-08-08

最新評論

简阳市| 开阳县| 米泉市| 乐东| 临夏市| 正定县| 西乌珠穆沁旗| 大安市| 阜南县| 张家川| 平顶山市| 滨州市| 襄垣县| 唐海县| 滦南县| 平泉县| 监利县| 大姚县| 新源县| 奎屯市| 汝阳县| 三门峡市| 志丹县| 石屏县| 旺苍县| 邳州市| 乌拉特中旗| 万年县| 商河县| 鹤庆县| 江源县| 广州市| 乐清市| 文水县| 共和县| 通榆县| 分宜县| 遂平县| 贞丰县| 会理县| 德江县|