‘Refs’
操做非受控組件《使用Ref》;event
,獲取EventTarget
《React事件系統》;Dom選擇器
;Dom操做插件
,例如Jquery
《React集成第三方庫》;在通常的網頁應用中,像使用原生JavaScript、Jquery開發的應用中,Dom操做是很常見的。html
而在典型的React數據流中,props
是父組件與子組件交互的惟一方式(單向數據流)。因此,爲了修改子組件,你須要傳遞新的props
去從新渲染它。react
然而,在某些狀況下,咱們須要脫離對React數據流動的依賴,去強制修改子組件。這些被修改的子組件,多是一個React組件實例,也多是實際的Dom元素。算法
Dom操做能夠直接將改變呈如今當前document,而不會促使組件更新,不會致使周期函數的調用(特殊狀況,Ref引用類組件實例)。可是,當組件更新時,這些操做也會參與「差分算法」dom
Refs
即是在這些狀況下,React提供的推薦解決方式。值得注意的是,像event.target
、dom選擇器
、dom操做插件
也是可以使用的方式,可是它們存在侷限性,好比:函數
id選擇器
沒法正常工做。而Refs
既可以操做實際Dom元素,又可以操做React組件實例(注意:class組件
能夠被使用,而function無狀態組件
不能被使用,由於它沒法被實例化)動畫
這裏有一些典型的使用狀況:.net
對於任何可聲明性完成的事情避免使用Refs
。 例如,在Dialog
組件中經過傳遞isOpen
屬性,來代替暴露open()
和close()
方法。插件
<div />
,這個<div />
不須要props
和state
的支撐,因此React沒有理由去更新它,能夠留給Dom操做插件
或選擇器
自由的管理這部分Dom。ID選擇器
,由於相同的組件可能會被屢次渲染,使得整個document
中存在多個元素具備相同id
屬性。(詳情可見《document中id屬性不惟一時,id選擇器如何工做》)Refs
、event.target
、dom選擇器
、Dom操做插件
對Dom節點的操做將保存在document中,並參與 「差分算法」,然而:
組件更新
將會對該組件對應的React元素子樹執行差別算法,若是新的狀態和屬性沒有影響到這些Dom操做,那麼操做將被保留,不然對Dom的操做會消失
或變得混亂
;組件卸載(路由)
,將會卸載組件,同時所包含的Dom節點會被銷燬、子組件也會被卸載,因此以前對Dom的操做也會消失(除非你專門記錄它:可使用父組件state
或storage
)頁面刷新
將會產生新的document,以前對Dom的操做將會消失(除非你專門記錄它:只能使用storage
)。Node.insertBefore()
之類的操做插入document以前,是沒有意義的,經過選擇器document.querySelector()
或document.getElementById()
只能得到null
,因此在document渲染完成前,操做Dom是無心義的。