高階元件應用 元件重新例項化

2021-08-01 22:34:02 字數 1330 閱讀 9138

在參與beisencloud和pagebuilder的對接任務中,出現了這樣乙個問題:有兩個元件同時關聯了同乙個屬性元件,並且在constructorcomponentdidmount內等做了一些初始化操作,當在這兩個元件之間切換的時候,由於屬性元件已經被首次render了,所以只進行了diff演算法,並沒有重新生成乙個新的元件例項,從而導致了屬性元件沒有同步更新

當然,我們可以在屬性元件內新增componentwillreceiveprops生命週期方法,通過nextprops上的引數,將constructor或者componentdidmount內的初始化配置邏輯重新走一遍

然而,這涉及到乙個問題:如果我們開發的很多屬性元件,都有這個問題,那我們不得不在每個元件內部都實現一遍這樣的邏輯,開發和維護的成本是很高的

在使用componentwillreceiveprops的時候,遇到乙個問題需要注意下:在該方法之內,render之前呼叫的所有同步操作,通過this.props訪問到的props都是舊的資料

既然這邏輯是需要在多處復用的,那我們就需要將這部分邏輯抽離出來,放在高階元件內完成,在需要的地方,通過該高階元件裝飾一下即可

該高階元件接收乙個條件方法,在componentwillreceiveprops生命週期方法中,將nextpropsthis.props暴露給條件方法,通過返回值用來控制是否需要重新例項化target

高階元件內部**實現如下

//高階元件,解決屬性元件不重新整理的問題

import react, from 'react'

export default conditionalfun => target => class

decorator

extends

component

} componentwillreceiveprops (nextprops) )

} else )

}} render () = this.state;

if (newinstance) />//新增key,繞過diff,重新生成新的例項

}return

this.props} />

}}

Jmail元件應用例項

if userip then userip request.servervariables remote addr 獲得真實ip set jmail server.createobject jmail.message jmail.silent true jmail.charset gb2312 字符...

ASP元件應用例項

1 vb6.0新建工程activex dll,引用 microsoft active server pages object library 和 microsoft activex data objects 2.1 library 工程名改為mydll,將類模組的名稱改為myclass,cls檔案內...

react元件化todolist例項

首先建立react的腳手架 具體建立步驟自己查 首先建立乙個todelist 在src下建立乙個components資料夾 裡面建立乙個todo的資料夾 todo裡面建立乙個index.js檔案這裡是父元件 在裡面寫 此處只是做乙個小例子演示下react的元件化 元件化的理解 1.元件的封裝 檢視 ...