国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【10】基礎(chǔ)知識(shí):React - DOM的diffing算法

這篇具有很好參考價(jià)值的文章主要介紹了【10】基礎(chǔ)知識(shí):React - DOM的diffing算法。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

【10】基礎(chǔ)知識(shí):React - DOM的diffing算法,React,react.js,javascript,前端

一、虛擬 DOM 中 key 的作用

react/vue 中的 key 有什么作用?key的內(nèi)部原理是什么?

簡(jiǎn)單來(lái)說(shuō):

key 是虛擬 DOM 對(duì)象的標(biāo)識(shí),在更新顯示時(shí) key 起著極其重要的作用,提高渲染效率,防止渲染錯(cuò)誤。

詳細(xì)的說(shuō):

當(dāng)狀態(tài)中的數(shù)據(jù)發(fā)生變化時(shí),React 會(huì)根據(jù)【新數(shù)據(jù)】生成【新的虛擬DOM】

隨后 React 進(jìn)行【新虛擬DOM】與【舊虛擬DOM】的 diff 比較,比較規(guī)則如下:

1、【舊虛擬DOM】中找到了與【新虛擬DOM】相同的 key:

若虛擬 DOM 中內(nèi)容沒(méi)變,直接使用之前的真實(shí) DOM

若虛擬 DOM 中內(nèi)容變了,則生成新的真實(shí)DOM,隨后替換掉頁(yè)面中之前的真實(shí) DOM

2、舊虛擬DOM中未找到與新虛擬DOM相同的key

根據(jù)數(shù)據(jù)創(chuàng)建新的真實(shí) DOM,隨后渲染到到頁(yè)面

“就地復(fù)用” 策略:

當(dāng)數(shù)據(jù)項(xiàng)的順序發(fā)生改變時(shí),他不會(huì)移動(dòng)頁(yè)面上的 DOM 元素匹配數(shù)據(jù)項(xiàng)順序的改變,而是簡(jiǎn)單的復(fù)用此處的元素

如果綁定了 key 屬性,就可對(duì)當(dāng)前 DOM 元素進(jìn)行唯一標(biāo)識(shí),在進(jìn)行數(shù)據(jù)更新渲染時(shí),會(huì)基于 key 的變化重新排列 DOM 元素的順序

二、用 index 作為 key 可能會(huì)引發(fā)的問(wèn)題

界面效果沒(méi)問(wèn)題, 但效率低:

若對(duì)數(shù)據(jù)進(jìn)行,逆序添加、逆序刪除等破壞順序操作,會(huì)產(chǎn)生沒(méi)有必要的真實(shí) DOM 更新

慢動(dòng)作回放----使用 index 索引值作為 key

根據(jù) diffing 算法規(guī)則,所有 DOM 元素都需要都需要重生成新的真實(shí) DOM:
存在相同key 0 和 1,但虛擬 DOM內(nèi)容改成了,需要生成新的真實(shí) DOM;
新增key2,需要生成新的真實(shí) DOM。

初始數(shù)據(jù):
{ id: 1, name: '小張', age: 18 },
{ id: 2, name: '小李', age: 19 }
初始的虛擬 DOM:
<li key=0>小張---18</li>
<li key=1>小李---19</li>

更新后的數(shù)據(jù):
{ id: 3, name: '小王', age: 20 },
{ id: 1, name: '小張', age: 18 },
{ id: 2, name: '小李', age: 19 }
更新數(shù)據(jù)后的虛擬 DOM:
<li key=0>小王---20</li>
<li key=1>小張---18</li>
<li key=2>小李---19</li>

界面有問(wèn)題:

如果結(jié)構(gòu)中還包含輸入類(lèi)的 DOM,會(huì)產(chǎn)生錯(cuò)誤 DOM 更新

慢動(dòng)作回放----使用 index 索引值作為 key (界面有問(wèn)題)

根據(jù) diffing 算法規(guī)則,內(nèi)部 input “就地復(fù)用”策略順序會(huì)錯(cuò)亂

初始數(shù)據(jù):
{ id: 1, name: '小張', age: 18 },
{ id: 2, name: '小李', age: 19 }
初始的虛擬 DOM:
<li key=0>小張---18<input type="text"/></li>
<li key=1>小李---19<input type="text"/></li>

更新后的數(shù)據(jù):
{ id: 3, name: '小王', age: 20 },
{ id: 1, name: '小張', age: 18 },
{ id: 2, name: '小李', age: 19 }
更新數(shù)據(jù)后的虛擬 DOM:
<li key=0>小王---20<input type="text"/></li>
<li key=1>小張---18<input type="text"/></li>
<li key=2>小李---19<input type="text"/></li>

注意:

如果不存在對(duì)數(shù)據(jù)的逆序添加、逆序刪除等破壞順序操作,僅用于渲染列表用于展示,使用 index 作為 key 是沒(méi)有問(wèn)題的。

三、開(kāi)發(fā)中如何選擇key?

1、最好使用每條數(shù)據(jù)的唯一標(biāo)識(shí)作為 key , 比如 id、手機(jī)號(hào)、身份證號(hào)、學(xué)號(hào)等唯一值。

2、如果確定只是簡(jiǎn)單的展示數(shù)據(jù),用 index 也是可以的。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-724591.html

四、示例

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>key的作用</title>
</head>
<body>
	<div id="test"></div>
	<!-- 引入react核心庫(kù) -->
	<script type="text/javascript" src="../js/react.development.js"></script>
	<!-- 引入react-dom -->
	<script type="text/javascript" src="../js/react-dom.development.js"></script>
	<!-- 引入babel -->
	<script type="text/javascript" src="../js/babel.min.js"></script>

	<script type="text/babel">		
		class Person extends React.Component {
			state = {
				persons: [
					{ id: 1, name: '小張', age: 18 },
					{ id: 2, name: '小李', age: 19 }
				]
			}

			add = () => {
				const { persons } = this.state
				const p = { id: persons.length + 1, name: '小王', age: 20 }
				this.setState({ persons: [p, ...persons] })
			}

			render() {
				return (
					<div>
						<h2>展示人員信息</h2>
						<button onClick={this.add}>添加一個(gè)小王</button>
						<h3>使用index(索引值)作為key</h3>
						<ul>
							{
								this.state.persons.map((personObj, index) => {
									return <li key={index}>{personObj.name}---{personObj.age}<input type="text" /></li>
								})
							}
						</ul>
						<hr />
						<hr />
						<h3>使用id(數(shù)據(jù)的唯一標(biāo)識(shí))作為key</h3>
						<ul>
							{
								this.state.persons.map((personObj) => {
									return <li key={personObj.id}>{personObj.name}---{personObj.age}<input type="text" /></li>
								})
							}
						</ul>
					</div>
				)
			}
		}
		
		ReactDOM.render(<Person />, document.getElementById('test'))
	</script>
</body>
</html>

到了這里,關(guān)于【10】基礎(chǔ)知識(shí):React - DOM的diffing算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第1章、react基礎(chǔ)知識(shí);

    一、react學(xué)習(xí)前期準(zhǔn)備; 1、基本概念; ; ; 二、react jsx語(yǔ)法; 三、react元素渲染; 四、react組件基礎(chǔ)之創(chuàng)建組件; 五、react props屬性; 六、react state 狀態(tài); 七、react組件生命周期函數(shù); 八、react setState 是同步還是異步; 九、react 條件渲染; 十、react列表渲染key; 十一、

    2024年04月11日
    瀏覽(25)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(四十二)——React Hooks的介紹

    【前端知識(shí)】React 基礎(chǔ)鞏固(四十二)——React Hooks的介紹

    Hook 是 React 16.8 的新增特性,它可以讓我們?cè)诓痪帉?xiě)class的情況下使用state以及其他的React特性(比如生命周期)。 class組件 VS 函數(shù)式組件: class的優(yōu)勢(shì): class組件可以定義自己的state,用來(lái)保存組件自己內(nèi)部的狀態(tài);而函數(shù)式組件不可以,因?yàn)楹瘮?shù)每次調(diào)用都會(huì)產(chǎn)生新的臨時(shí)

    2024年02月14日
    瀏覽(33)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU相關(guān)

    React 的渲染流程 JSX - 虛擬 DOM - 真實(shí) DOM React 的更新流程 props/state 改變 - render函數(shù)重新執(zhí)行 - 產(chǎn)生新的DOM樹(shù) - 新舊DOM樹(shù)進(jìn)行diff - 計(jì)算出差異進(jìn)行更新 - 更新到真實(shí)的DOM React 在 props 或 state 發(fā)生改變時(shí),會(huì)調(diào)用 React 的 render 方法,會(huì)創(chuàng)建一顆不同的樹(shù) React 需要基于這兩顆不同的

    2024年02月15日
    瀏覽(39)
  • 【01】基礎(chǔ)知識(shí):React簡(jiǎn)介與案例

    React 概述 React 是一個(gè)將數(shù)據(jù)渲染為 HTML 視圖 的開(kāi)源 JavaScript 庫(kù) React 由 FaceBook 開(kāi)發(fā),且開(kāi)源 為什么要學(xué)習(xí) React 1、原生 JavaScript 操作 DOM 繁瑣、效率低(使用 DOM-API 操作 UI) 2、使用 JavaScript 直接操作 DOM,瀏覽器會(huì)進(jìn)行大量的重繪重排 3、原生 JavaScript 沒(méi)有組件化編碼方案,

    2024年02月07日
    瀏覽(34)
  • React Native 圖片組件基礎(chǔ)知識(shí)

    React Native 圖片組件基礎(chǔ)知識(shí)

    在 React Native 中使用圖片其實(shí)跟 HTML 中使用圖片一樣簡(jiǎn)單,在 React Native 中我們使用 Image 組件來(lái)呈現(xiàn)圖片的內(nèi)容,其中主要的屬性有: source 。這個(gè)屬性主要是設(shè)置圖片的內(nèi)容,它可以是網(wǎng)絡(luò)圖像地址、靜態(tài)資源、臨時(shí)本地圖像以及本地磁盤(pán)中的圖像。 搭建基礎(chǔ)框架 編寫(xiě)卡片

    2024年02月13日
    瀏覽(20)
  • React Native 樣式布局基礎(chǔ)知識(shí)

    React Native 樣式布局基礎(chǔ)知識(shí)

    通過(guò)此篇筆記能夠?qū)W習(xí)到如下的幾個(gè)知識(shí)點(diǎn) 在 React Native 中使用樣式的一些細(xì)節(jié) 了解 React Native 的 Flex 布局概念 了解 React Native 的 flex 布局屬性 React Native 如何添加多樣式屬性 React Native 中絕對(duì)布局和相對(duì)布局 1、主軸和交叉軸 在 Flex 布局中存在主軸和交叉軸的概念,主軸和交

    2024年02月13日
    瀏覽(28)
  • React Native 文本輸入基礎(chǔ)知識(shí)

    在 React Native 中提供了一個(gè)文本輸入組件 TextInput 。此組件主要是監(jiān)聽(tīng)鍵盤(pán)輸入事件,并把對(duì)應(yīng)的輸入值顯示在組件中,此組件還提供了很多功能配置參數(shù),例如自動(dòng)更正、自動(dòng)大寫(xiě)、占位符文本和不同的鍵盤(pán)類(lèi)型(例如數(shù)字鍵盤(pán))。 我們首先來(lái)編寫(xiě)一個(gè)簡(jiǎn)單的實(shí)例,使用

    2024年02月12日
    瀏覽(22)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(十三)——列表渲染

    在 React 中沒(méi)有像 Vue 模塊語(yǔ)法中的 v-for 指令,而是需要我們通過(guò) JS 代碼的方式組織數(shù)據(jù),轉(zhuǎn)成 JSX 在 React 中,展示列表最多的方式就是使用數(shù)組的 map 高階函數(shù) 在展示數(shù)組前,有時(shí)會(huì)進(jìn)行一些處理 過(guò)濾一些內(nèi)容(filter 函數(shù)) 截取數(shù)組中的一部分內(nèi)容(slice 函數(shù)) 列表中的

    2024年02月10日
    瀏覽(30)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十九)——React-Router的基本使用

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十九)——React-Router的基本使用

    Router中包含了對(duì)路徑改變的監(jiān)聽(tīng),并且會(huì)將相應(yīng)的路徑傳遞給子組件。 Router包括兩個(gè)API: BrowserRouter使用history模式 HashRouter使用hash模式(路徑后面帶有#號(hào)) 嘗試在項(xiàng)目中使用HashRouter: 安裝Router 在 index.js 中引入并使用HashRouter Routes:包裹所有的Route,在其中匹配一個(gè)路由(

    2024年02月14日
    瀏覽(27)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(四十)——Navigate導(dǎo)航

    【前端知識(shí)】React 基礎(chǔ)鞏固(四十)——Navigate導(dǎo)航

    新建Login頁(yè)面,在Login中引入Navigate,實(shí)現(xiàn)點(diǎn)擊登陸按鈕跳轉(zhuǎn)至 /home 路徑下: 當(dāng)路由均無(wú)匹配時(shí),通過(guò)Navigate跳轉(zhuǎn)至NotFound界面,其中 * 為通配符: 構(gòu)建NotFound.jsx 在A(yíng)pp.jsx中配置NotFound: 構(gòu)建Home的子路由頁(yè)面: HomeRecommend.jsx HomeRanking.jsx 利用 Route 嵌套子路由,實(shí)現(xiàn)Home頁(yè)面下的

    2024年02月14日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包