您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關React碰到v-if的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
代碼:
import React from 'react' const App = () => { const record = { toKe: true, // 貝殼首頁 toSecondHand: true, // 二手房 toFang: true, // 新房 } return ( <div style={{width: 600, margin: '50px auto'}}> <ul> <li> <h4>react常規寫法</h4> { record.toKe ? <a style={{padding: 20}} href="https://bj.ke.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a> : null } { record.toSecondHand ? <a style={{padding: 20}} href="https://bj.ke.com/ershoufang/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a> : null } { record.toFang ? <a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a> : null } </li> </ul> </div> ) } export default App
如上述代碼,我們在項目中會遇到很多這樣的寫法, 細看一下沒什么問題,可是當在重構老項目的時候,你會發現這個代碼結構是多么痛苦,特別是如下的結構。
{ record.toFang && record.toKe && record.toSecondHand && <div> <a style={{padding: 20}} href="https://bj.ke.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a> <a style={{padding: 20}} href="https://bj.ke.com/ershoufang/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a> <a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a> </div> }
雖然代碼邏輯沒問題,但人生就是這樣,有時候出場順序真的很重要。突然就想起vue的v-if了。
沒錯,回歸主題,就是:react中模擬vue的v-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> <h4>react模擬實現vue中v-if指令</h4> <Hidden visible={record.toKe} tag='span'> <a href="https://bj.ke.com" 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 href="https://bj.ke.com/ershoufang/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a> </Hidden> <Hidden visible={record.toFang} tag='p'> <a href="https://bj.fang.ke.com/loupan/" 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> ) } }
如此簡單,但筆者審查元素的時候發現,每個Hidden下的children莫名被嵌套了一層div
如下
原來的橫著排列的元素,一下子豎著排列了。這可不太好,本來給我套個div,我都可以勉強接收,現在連我布局都給我變了。
怎么辦?筆者突然想到使用vue-router中的router-link時,標簽是可以通過tag去替換默認標簽的。
那我們再給它個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 ( // 嘗試用這種方法去實現,發現不符合react的規則,所以使用最原始的渲染方法 // React.createElement // `<`${tag}`>` + { content } + `</`${tag}`>` // ) } }
問題:筆者的初衷是模擬vue的v-if, 所以對傳入的children并沒做太多處理,不建議做多做封裝。有興趣的同學可以自己玩。
{ record.toFang && record.toKe && record.toSecondHand && <span> <a style={{padding: 20}} href="https://bj.ke.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a> <a style={{padding: 20}} href="https://bj.ke.com/ershoufang/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a> <a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/" 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 href="https://bj.ke.com" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >貝殼首頁</a> <a style={{padding: 20}} href="https://bj.ke.com/ershoufang/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >二手房</a> <a style={{padding: 20}} href="https://bj.fang.ke.com/loupan/" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >新房</a> </Hidden>
其實感覺也沒多大用處hhhh
關于“React碰到v-if的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。