日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

React as a UI Runtime(四、条件)

發(fā)布時(shí)間:2025/3/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 React as a UI Runtime(四、条件) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
如果React在更新中只重用與元素類型相匹配的宿主實(shí)例,那按渲染條件選擇的內(nèi)容怎么辦呢?
正如下面的代碼,假如我們開始至需要一個(gè)input,但稍后需要在它之前渲染一個(gè)message : // 第一次渲染 ReactDOM.render(<dialog><input /></dialog>,domContainer );// 第二次渲染 ReactDOM.render(<dialog><p>I was just added here!</p><input /></dialog>,domContainer );

在這個(gè)例子中,<input>宿主實(shí)例將會(huì)被重建。React會(huì)遍歷元素樹,并與之前的版本比較:

  • dialog → dialog: 可以重復(fù)使用嗎? 可以-type匹配。
  • input → p:可以重復(fù)使用嗎?不行,type已經(jīng)改變了!需要?jiǎng)h除存在的input,并創(chuàng)建新的p宿主實(shí)例。
  • (nothing) → input: 需要新建一個(gè)input宿主實(shí)例。

React這樣的代碼是如下的:

let oldInputNode = dialogNode.firstChild; dialogNode.removeChild(oldInputNode);let pNode = document.createElement('p'); pNode.textContent = 'I was just added here!'; dialogNode.appendChild(pNode);let newInputNode = document.createElement('input'); dialogNode.appendChild(newInputNode);

這不是一種好的更新方式,因?yàn)樵瓌t上input并沒有被p替代-它僅僅是移動(dòng)了。我們不想要因?yàn)橹匦聞?chuàng)建Dom元素而失去它的選中狀態(tài),聚焦?fàn)顟B(tài)和顯示內(nèi)容。
幸好這個(gè)問題有一個(gè)簡單的修復(fù)方式,他并不在React應(yīng)用中常見。
在實(shí)踐中,你很少會(huì)直接調(diào)用ReactDOM.render,實(shí)際上,React app常常會(huì)拆分成像下面這樣的函數(shù):

function Form({ showMessage }) {let message = null;if (showMessage) {message = <p>I was just added here!</p>;}return (<dialog>{message}<input /></dialog>); }

This example doesn’t suffer from the problem we just described. It might be easier to see why if we use object notation instead of JSX. Look at the dialog child element tree:
這個(gè)例子并不會(huì)有我們之前描述的那個(gè)問題,如果我們使用對(duì)象來代替JSX描述會(huì)更加明顯,下面是dialog子元素樹:

function Form({ showMessage }) {let message = null;if (showMessage) {message = {type: 'p',props: { children: 'I was just added here!' }};}return {type: 'dialog',props: {children: [message,{ type: 'input', props: {} }]}}; }

function Form({ showMessage }) {
let message = null;
if (showMessage) {

message = {type: 'p',props: { children: 'I was just added here!' } };

}
return {

type: 'dialog', props: {children: [message,{ type: 'input', props: {} }] }

};
}

不管showMessage 是true的還是false,<input>是第二個(gè)子元素,并且在render中不會(huì)改變它的位置。
如果showMessage 從false變?yōu)閠rue,React會(huì)遍歷元素樹,并與之前的版本相比較:

  • dialog → dialog:可以重復(fù)使用嗎? 可以-type匹配。
  • (null) → p:需要插入一個(gè)新的p宿主實(shí)例。
  • input → input: 可以重復(fù)使用嗎? 可以-type匹配。

那么React會(huì)執(zhí)行類似于下面的代碼:

let inputNode = dialogNode.firstChild; let pNode = document.createElement('p'); pNode.textContent = 'I was just added here!'; dialogNode.insertBefore(pNode, inputNode);

input的狀態(tài)并不會(huì)改變

總結(jié)

以上是生活随笔為你收集整理的React as a UI Runtime(四、条件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 男性裸体全身精光gay | 精品国产精品网麻豆系列 | 国产精品一区二区三区免费观看 | wwwwxxx日本| 中文字幕欧美视频 | 自拍偷拍18p| 嫩草99 | 亚洲欧美第一页 | 亚洲国产精品无码专区 | 肉嫁高柳家在线看 | 丁香婷婷综合激情五月色 | 亚洲aa在线 | 97se综合 | 无码人妻少妇色欲av一区二区 | 亚洲国产一区二区在线 | 光明影院手机版在线观看免费 | 91性高潮久久久久久久久 | 欧美日韩一区二 | 亚洲精品一二三 | 亚洲91在线 | 黄色大片a级 | 午夜激情在线观看视频 | www精品国产 | jizz亚洲女人| 国产成人a v | 亚洲一区在线电影 | 九九九九九伊人 | 久久影院精品 | 久伊人| 免费人妻一区二区三区 | 91琪琪| 九九自拍偷拍 | 综合视频在线 | www亚洲精品 | 男女视频在线免费观看 | 久久久免费精品 | 国产一区二区精华 | 精品视频免费在线观看 | 青青草超碰在线 | 欧美乱日| 色综合五月 | 青青av| 成人午夜影视 | 精品无码在线视频 | 国产精品天美传媒入口 | 天天操操操操操 | 伊人色图 | 久久久久99 | 日本少妇在线 | 国产超碰97 | 亚洲精华液一区二区 | 少妇特黄a一区二区三区88av | 人人干免费 | 亚洲精品www久久久久久广东 | 青娱乐在线视频免费观看 | 国产精品情侣自拍 | 天堂在线免费观看视频 | 麻豆91精品 | 亚洲永久无码7777kkk | 久久人人视频 | 国产日产精品一区二区三区 | 久久丫精品久久丫 | 国产日韩欧美二区 | www香蕉视频 | 精品国产精品国产偷麻豆 | 国产精品12区 | 黑人精品xxx一区一二区 | 日日操夜夜操狠狠操 | 绿帽人妻精品一区二区 | 日本黄色免费大片 | 国产又粗又黄又爽 | 男女午夜免费视频 | 婷婷久久五月 | 成人av动漫 | 欧美日本激情 | 欧美日韩一区二区在线 | 92久久精品一区二区 | 你懂的av在线 | 毛片视屏| 韩日av一区二区 | 色欲av伊人久久大香线蕉影院 | 欧美另类第一页 | 澳门三级| 日本道中文字幕 | 免费av在线播放网址 | 天天插天天插 | 国产在线观看不卡 | 亚洲人成人一区二区在线观看 | 欧美1级片 | 影音先锋日韩资源 | 国产人伦精品一区二区三区 | 久草香蕉视频 | 最新中文字幕2019 | 伊人久久免费视频 | 久久久久综合网 | 日韩在线视频看看 | 久操新在线 | 欧美色一区二区三区在线观看 | 成年人免费黄色片 |