国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

我老板:你根本不懂 React!

開發 前端
我已經使用 React 多年,我確信我非常了解它,但最近我的老板對我說,“你根本不知道 React,你對它一無所知。”

前言

我已經使用 React 多年,我確信我非常了解它,但最近我的老板對我說,“你根本不知道 React,你對它一無所知。”

我很生他的氣,但他指出了我程序中的三個漏洞。我現在把它記錄下來,也分享給還不知道的小伙伴。

1、你知道“&&”的用法嗎?

在React程序中,我經常使用“&&”運算符來決定是否顯示內容,具體方式如下:

const App = () => {
const [ list, setList ] = useState([])

// Simulation request data
setTimeout(() => {
setList([ 'fatfish', 'medium' ])
}, 2000)

return (
<div className="app">{ list.length && <List /> }</div>
)
}

我老板:“你不知道&&”運算符的特點嗎?當請求還沒有成功返回時,會直接渲染“0”。

我不服氣,因為我一直都是這樣寫代碼,從來沒有犯過錯誤。為了證明老大錯了,我寫了下面的例子。


const List = ({ list = [] }) => {
return (
<div className="name-list-container">
{
list.map((name) => {
return <div className="name-list-item">{ name }</div>
})
}
</div>
)
}

const App = () => {
const [ list, setList ] = React.useState([ ])

// Simulation request data
setTimeout(() => {
setList([ 'fatfish', 'medium' ])
}, 3000)

return (
list.length && <List list={ list }/>
)
}

ReactDOM.render(<App />, document.getElementById('app'))

我的天啊!老大說的對,一開始頁面顯示0,3秒后顯示列表。

為什么?

來自 MDN的提示:“當且僅當所有操作數都為真時,一組布爾操作數的邏輯與 (&&) 運算符(邏輯合取)才為真。否則就是假的。”

更一般地,運算符返回從左到右計算時遇到的第一個假操作數的值,或者如果它們都是真值,則返回最后一個操作數的值。

例子如下:

const x1 = 0
const x2 = 'fatfish'
const x3 = 1
const x4 = 'medium'
console.log(x1 && x2) // 0
console.log(x3 && x4) // medium

現在我終于明白為什么寫這樣的代碼會導致錯誤。原因如下:

list.length && <List list={ list } /> 
0 && <List list={ list } /> // 0

如何解決?

我找到了三種方法來解決這個問題。我希望你不要犯和我一樣的錯誤,祝福你。


// 1. Convert list.length to boolean
!!list.length && <List list={ list }/>

// 2. Use ternary expressions and null
list.length ? <List list={ list }/> : null

// 3. Controlled by specific logic
list.length >= 1 && <List list={ list }/>

2.“props.children”的奇怪行為

我猜你寫過類似的代碼。當向 <Container /> 組件傳遞內容時,會顯示“children”。如果沒有,將顯示一個空的工具提示。像下面這樣:

const Container = ({ children }) => {
if (children) {
return (
<div className="children-container">
<p>The content of children is:</p>
{ children }
</div>
)
} else {
return (
<div className="empty">empty</div>
)
}
}

我的老板:“你要小心使用‘children’屬性,它會導致邏輯異常!就像在以下情況中一樣。”

1).清空列表數據

你認為這個例子會顯示什么——“空”?

不幸的是,答案是另一個。你是不是也覺得不可思議?朋友們,我們一定要非常小心地使用 props.children。否則,老板可能會扣你的工資。


const Container = ({ children }) => {
if (children) {
return (
<div className="children-container">
<p>The content of children is:</p>
{ children }
</div>
)
} else {
return (
<div className="empty">empty</div>
)
}
}
const App = () => {
const [ list, setList ] = React.useState([])

return (
<Container>
{
list.map((name) => {
return <div className="name-item">{ name }</div>
})
}
</Container>
)
}
ReactDOM.render(<App />, document.getElementById('app'))

為什么?

讓我們向“Container”組件添加一行代碼,并嘗試打印children是什么!


const Container = ({ children }) => {
console.log(children, 'children')
// ...
}

是的,你是對的。此時“children”為空數組,所以顯示“children的內容為:”而不是“empty”。

圖片

如何解決?

使用 React.Children.toArray 解決這個問題會很容易,然后你會看到顯示“empty”。所以如果你真的需要用children作為條件判斷,我建議你使用這個方法!

const Container = ({ children }) => {
// if (children) {
// Pay attention here
if (React.Children.toArray(children).length) {
return (
<div className="children-container">
<p>The content of children is:</p>
{ children }
</div>
)
} else {
return (
<div className="empty">empty</div>
)
}
}

3.關于掛載和更新的問題

在 React 中通過狀態來切換組件是很常見的,但是,這個小東西也會讓你感到困惑。

在下面的代碼中,你認為當你切換name的值時,一個Demo組件會被卸載,另一個會被掛載嗎?


class Demo extends React.Component {
componentDidMount() {
console.log('componentDidMount', this.props.name);
}
componentDidUpdate() {
console.log('componentDidUpdate', this.props.name);
}

render () {
return (
<div>
{ this.props.name }
</div>
)
}
}
const App = () => {
const [ name, setName ] = React.useState('fatfish')
const onClick = () => {
setName(name === 'fatfish' ? 'medium' : 'fatfish')
}
return (
<div className="app">
{
name === 'fatfish' ?
<Demo name={ name } /> :
<Demo name={ name } />
}
<button onClick={ onClick }>click</button>
</div>
)
}
ReactDOM.render(<App />, document.getElementById('app'))

我錄制了一個簡短的 gif 給你真相。

圖片

你也可以通過 CodePen 試試,https://codepen.io/qianlong/pen/NWywodV

為什么?

雖然,我們寫了兩個 Demo 組件,假設它們會分別掛載和更新,但 React 認為它們是同一個組件,所以 componentDidMount 只會執行一次。

如何解決?

但是當我們要寫兩個相同的組件但是傳遞不同的參數時,我們應該怎么辦呢?

是的,你應該為這兩個組件添加不同的鍵,這樣 React 就會認為它們是不同的組件。componentDidMount 也會單獨執行。

我們試試看:

//...
// Pay attention here
name === 'fatfish' ? <Demo key="1" name={ name } /> : <Demo key="2" name={ name } />
//...

圖片

你也可以通過 CodePen 試試,https://codepen.io/qianlong/pen/NWywodV。


責任編輯:華軒 來源: web前端開發
相關推薦

2012-09-17 10:20:11

2016-11-10 20:50:20

微軟開源

2020-07-13 07:49:38

Kubernetes容器架構

2013-09-23 10:36:17

Hadoop大數據

2015-09-18 10:01:11

2025-11-11 09:03:00

2024-07-01 13:02:53

2022-06-14 11:15:09

代碼驅動

2014-09-29 09:38:10

BASHBUG

2018-08-06 16:04:31

數據科學家數據庫數據分析

2010-08-20 09:52:36

丁磊管理

2013-02-28 09:32:02

私有云資源池自服務

2020-07-15 08:10:00

瀏覽器安全Fetch

2025-10-20 08:59:00

2023-11-02 08:27:29

2017-03-21 13:53:17

運維戴爾企業級解決方案

2010-12-21 11:31:09

2009-11-23 08:47:36

2009-10-28 09:14:43

員工分析軟件

2013-07-05 10:40:55

管理者技術
點贊
收藏

51CTO技術棧公眾號

日韩免费性生活视频播放| www.日韩免费| 日本精品一区二区三区视频| 国产精品**亚洲精品| 一本到一区二区三区| 逼特逼视频在线| 国产视频久久| 国产欧美一区二区| 国产精品亚洲综合在线观看 | 亚洲综合日韩| 4k岛国日韩精品**专区| 亚洲成人短视频| 日韩欧美二区三区| 三级毛片在线免费看| 国产精品久久久久影视| 精品一二三四五区| 天堂蜜桃91精品| 99久久一区三区四区免费| 欧美1区二区| 日韩中文在线不卡| 毛片在线导航| 欧美丰满美乳xxx高潮www| 小小水蜜桃在线观看| 亚洲欧洲美洲综合色网| 国产一区二区三区在线免费| 日韩av高清在线观看| 国产成人免费观看| 97国产精品| 国产精品福利在线观看网址| 欧美黄色网视频| 色综合天天狠天天透天天伊人| 日韩电影免费观看高清完整版| 欧美变态口味重另类| 亚洲成人三级| 精品婷婷伊人一区三区三| 青青草视频免费在线观看| 亚洲成人动漫在线观看| 中文字幕一二三区在线观看| 亚洲黄色性网站| 免费观影入口看日本视频| 亚洲男人的天堂在线观看| 99精产国品一二三产品香蕉| 亚洲精品欧美综合四区| 日本调教视频在线观看| 亚洲精品五月天| 在线一区二区三区精品| 欧美色xxxx| jizz视频在线观看| 7799精品视频| 污的网站在线观看| 亚洲第一中文字幕| 亚洲成人不卡| 国产亚洲欧美另类中文| 四虎国产精品成人免费影视| 欧美成人午夜视频| 日韩激情网站| 成人深夜直播免费观看| 亚洲美女91| 中文字幕一区二区三区有限公司 | 色综久久综合桃花网| 国产精成人品2018| 久久精品国产成人精品| 国产精品视频首页| 91大神在线播放精品| 黑丝美女一区二区| 国产高清一区二区三区| 日本在线不卡视频| 欧美精品久久久久久久自慰 | 黄页网站大全一区二区| 97视频在线免费| 日本一区二区三区在线不卡| 成年人免费网站| 在线精品视频小说1| 成人影院在线播放| 九色精品免费永久在线| 青青草成人影院| 蜜桃久久影院| 成人妖精视频yjsp地址| 亚洲jjzzjjzz在线观看| 色av成人天堂桃色av| 日韩伦理在线一区| 97国产在线视频| 欧美精品国产一区| 国产一区一区三区| 亚洲欧洲韩国日本视频| jizz视频在线观看| 久久福利视频导航| 欧美精品一卡| 日本国产在线播放| 欧美性少妇18aaaa视频| 成人线上视频| 国产日韩欧美日韩| 国产成人av一区二区| 一级毛片国产| 日韩精品中文字| 国产欧美日韩在线观看视频| 欧美日韩高清在线一区| 国产精品无码永久免费888| 国产日产一区二区三区| 性色av一区二区三区| 老司机午夜精品视频| 制服丝袜影音| 精品伊人久久97| 希岛爱理一区二区三区| 欧美乱做爰xxxⅹ久久久| 黄色成人在线免费| 激情中国色综合| 国产成人免费电影| 国产精品毛片大码女人| 欧美xxxbbb| 国产精品亚洲自拍| 91美女在线视频| 免费在线国产视频| 成人h视频在线观看播放| 成人永久看片免费视频天堂| 人人九九精品| 久久久久成人精品| 久久99精品国产.久久久久久| 在线视频你懂| 97视频免费在线观看| 国产精品一区免费视频| 成年在线观看免费人视频| 久久久免费在线观看| 韩国精品在线观看| av中文天堂在线| 日本免费一区二区三区视频观看| 国产一区二区福利视频| 福利在线观看| 国产一区欧美二区三区| 国产精品日日摸夜夜摸av| 成人免费看黄| 欧美在线一区二区三区四区| 狠狠久久亚洲欧美专区| 激情亚洲另类图片区小说区| 大西瓜av在线| 日韩精品亚洲元码| 日韩精品电影一区亚洲| 888av在线| 91成人免费在线观看| 一区二区三区在线影院| 美女扒开腿让男人桶爽久久动漫| 国产欧美日韩小视频| 亚洲精品福利在线观看| 欧美专区18| 九义人在线观看完整免费版电视剧| 国产一区二区色| 亚洲一区在线观看视频| 视频一区中文| 国产美女被遭强高潮免费网站| 欧美裸体xxxx极品少妇| 成人性视频免费网站| 日韩在线观看不卡| 欧洲精品在线播放| 国产一区二区黄| 国产激情91久久精品导航| 欧美大胆成人| 日本一区二区三区四区五区六区| 精品国产一区久久| 另类综合日韩欧美亚洲| 亚洲天堂电影| 国产v片免费观看| 久久中文字幕在线| 国产欧美日韩综合精品一区二区| 中文字幕亚洲在线观看| 四季av一区二区| 992tv在线成人免费观看| 日韩一区中文字幕| 91亚洲国产| 免费在线看黄| 一区二区三区四区| 色狠狠久久aa北条麻妃 | 国产精品专区一| 日韩欧美成人精品| 亚洲一级电影| 色噜噜狠狠狠综合欧洲色8| 一区二区成人国产精品| 在线观看日韩www视频免费| 99久久99久久精品免费观看| 亚洲**毛片| 宅男宅女性影片资源在线1| 亚洲最大福利视频网| 欧美丰满高潮xxxx喷水动漫| 日本色综合中文字幕| 写真福利精品福利在线观看| 日本一极黄色片| 国产精品免费久久久久影院| 福利一区视频在线观看| 三级在线观看一区二区| 国产69精品久久久久按摩| 最新天堂中文在线| 91在线中文字幕| 日韩美一区二区三区| av不卡免费在线观看| 亚洲大片精品免费| 9i精品一二三区| cao在线观看| 国产美女主播一区| 亚洲第一免费播放区| 久久精品一区二区三区四区| 亚洲国产日韩欧美在线|