摘要:但在中會(huì)有些不同,包含表單元素的組件將會(huì)在中追蹤輸入的值,并且每次調(diào)用回調(diào)函數(shù)時(shí),如會(huì)更新,重新渲染組件。在構(gòu)造函數(shù)中調(diào)用的目的是什么在被調(diào)用之前,子類是不能使用的,在中,子類必須在中調(diào)用。將使用單個(gè)事件監(jiān)聽器監(jiān)聽頂層的所有事件。
已經(jīng)開源
地址:https://github.com/nanhupatar...
關(guān)注我們團(tuán)隊(duì):
Keys 是 React 用于追蹤哪些列表中元素被修改、被添加或者被移除的輔助標(biāo)識(shí)。
render () { return (
在開發(fā)過程中,我們需要保證某個(gè)元素的 key 在其同級(jí)元素中具有唯一性。在 React Diff 算法中 React 會(huì)借助元素的 Key 值來判斷該元素是新近創(chuàng)建的還是被移動(dòng)而來的元素,從而減少不必要的元素重渲染。此外,React 還需要借助 Key 值來判斷元素與本地狀態(tài)的關(guān)聯(lián)關(guān)系,因此我們絕不可忽視轉(zhuǎn)換函數(shù)中 Key 的重要性。
調(diào)用 setState 之后發(fā)生了什么?在代碼中調(diào)用 setState 函數(shù)之后,React 會(huì)將傳入的參數(shù)對(duì)象與組件當(dāng)前的狀態(tài)合并,然后觸發(fā)所謂的調(diào)和過程(Reconciliation)。經(jīng)過調(diào)和過程,React 會(huì)以相對(duì)高效的方式根據(jù)新的狀態(tài)構(gòu)建 React 元素樹并且著手重新渲染整個(gè) UI 界面。在 React 得到元素樹之后,React 會(huì)自動(dòng)計(jì)算出新的樹與老樹的節(jié)點(diǎn)差異,然后根據(jù)差異對(duì)界面進(jìn)行最小化重渲染。在差異計(jì)算算法中,React 能夠相對(duì)精確地知道哪些位置發(fā)生了改變以及應(yīng)該如何改變,這就保證了按需更新,而不是全部重新渲染。
react 生命周期函數(shù)
初始化階段:
getDefaultProps:獲取實(shí)例的默認(rèn)屬性
getInitialState:獲取每個(gè)實(shí)例的初始化狀態(tài)
componentWillMount:組件即將被裝載、渲染到頁面上
render:組件在這里生成虛擬的 DOM 節(jié)點(diǎn)
componentDidMount:組件真正在被裝載之后
運(yùn)行中狀態(tài):
componentWillReceiveProps:組件將要接收到屬性的時(shí)候調(diào)用
shouldComponentUpdate:組件接受到新屬性或者新狀態(tài)的時(shí)候(可以返回 false,接收數(shù)據(jù)后不更新,阻止 render 調(diào)用,后面的函數(shù)不會(huì)被繼續(xù)執(zhí)行了)
componentWillUpdate:組件即將更新不能修改屬性和狀態(tài)
render:組件重新描繪
componentDidUpdate:組件已經(jīng)更新
銷毀階段:
componentWillUnmount:組件即將銷毀
shouldComponentUpdate 是做什么的,(react 性能優(yōu)化是哪個(gè)周期函數(shù)?)shouldComponentUpdate 這個(gè)方法用來判斷是否需要調(diào)用 render 方法重新描繪 dom。因?yàn)?dom 的描繪非常消耗性能,如果我們能在 shouldComponentUpdate 方法中能夠?qū)懗龈鼉?yōu)化的 dom diff 算法,可以極大的提高性能。
參考react 性能優(yōu)化-sf
為什么虛擬 dom 會(huì)提高性能?(必考)虛擬 dom 相當(dāng)于在 js 和真實(shí) dom 中間加了一個(gè)緩存,利用 dom diff 算法避免了沒有必要的 dom 操作,從而提高性能。
用 JavaScript 對(duì)象結(jié)構(gòu)表示 DOM 樹的結(jié)構(gòu);然后用這個(gè)樹構(gòu)建一個(gè)真正的 DOM 樹,插到文檔當(dāng)中當(dāng)狀態(tài)變更的時(shí)候,重新構(gòu)造一棵新的對(duì)象樹。然后用新的樹和舊的樹進(jìn)行比較,記錄兩棵樹差異把 2 所記錄的差異應(yīng)用到步驟 1 所構(gòu)建的真正的 DOM 樹上,視圖就更新了。
參考 如何理解虛擬 DOM?-zhihu
react diff 原理(??迹髲S必考)把樹形結(jié)構(gòu)按照層級(jí)分解,只比較同級(jí)元素。
給列表結(jié)構(gòu)的每個(gè)單元添加唯一的 key 屬性,方便比較。
React 只會(huì)匹配相同 class 的 component(這里面的 class 指的是組件的名字)
合并操作,調(diào)用 component 的 setState 方法的時(shí)候, React 將其標(biāo)記為 dirty.到每一個(gè)事件循環(huán)結(jié)束, React 檢查所有標(biāo)記 dirty 的 component 重新繪制.
選擇性子樹渲染。開發(fā)人員可以重寫 shouldComponentUpdate 提高 diff 的性能。
參考:React 的 diff 算法
React 中 refs 的作用是什么?Refs 是 React 提供給我們的安全訪問 DOM 元素或者某個(gè)組件實(shí)例的句柄。我們可以為元素添加 ref 屬性然后在回調(diào)函數(shù)中接受該元素在 DOM 樹中的句柄,該值會(huì)作為回調(diào)函數(shù)的第一個(gè)參數(shù)返回:
class CustomForm extends Component { handleSubmit = () => { console.log("Input Value: ", this.input.value) } render () { return (
上述代碼中的 input 域包含了一個(gè) ref 屬性,該屬性聲明的回調(diào)函數(shù)會(huì)接收 input 對(duì)應(yīng)的 DOM 元素,我們將其綁定到 this 指針以便在其他的類函數(shù)中使用。另外值得一提的是,refs 并不是類組件的專屬,函數(shù)式組件同樣能夠利用閉包暫存其值:
function CustomForm ({handleSubmit}) { let inputElement return (
{(user) => user === null ? : }
import React, { Component, PropTypes } from "react" import fetchUser from "twitter" // fetchUser take in a username returns a promise // which will resolve with that username"s data. class Twitter extends Component { // finish this }
如果你還不熟悉回調(diào)渲染模式(Render Callback Pattern),這個(gè)代碼可能看起來有點(diǎn)怪。這種模式中,組件會(huì)接收某個(gè)函數(shù)作為其子組件,然后在渲染函數(shù)中以 props.children 進(jìn)行調(diào)用:
import React, { Component, PropTypes } from "react" import fetchUser from "twitter" class Twitter extends Component { state = { user: null, } static propTypes = { username: PropTypes.string.isRequired, } componentDidMount () { fetchUser(this.props.username) .then((user) => this.setState({user})) } render () { return this.props.children(this.state.user) } }
這種模式的優(yōu)勢在于將父組件與子組件解耦和,父組件可以直接訪問子組件的內(nèi)部狀態(tài)而不需要再通過 Props 傳遞,這樣父組件能夠更為方便地控制子組件展示的 UI 界面。譬如產(chǎn)品經(jīng)理讓我們將原本展示的 Badge 替換為 Profile,我們可以輕易地修改下回調(diào)函數(shù)即可:
展示組件(Presentational component)和容器組件(Container component)之間有何不同{(user) => user === null ? : }
展示組件關(guān)心組件看起來是什么。展示專門通過 props 接受數(shù)據(jù)和回調(diào),并且?guī)缀醪粫?huì)有自身的狀態(tài),但當(dāng)展示組件擁有自身的狀態(tài)時(shí),通常也只關(guān)心 UI 狀態(tài)而不是數(shù)據(jù)的狀態(tài)。
容器組件則更關(guān)心組件是如何運(yùn)作的。容器組件會(huì)為展示組件或者其它容器組件提供數(shù)據(jù)和行為(behavior),它們會(huì)調(diào)用 Flux actions,并將其作為回調(diào)提供給展示組件。容器組件經(jīng)常是有狀態(tài)的,因?yàn)樗鼈兪?其它組件的)數(shù)據(jù)源。
類組件(Class component)和函數(shù)式組件(Functional component)之間有何不同類組件不僅允許你使用更多額外的功能,如組件自身的狀態(tài)和生命周期鉤子,也能使組件直接訪問 store 并維持狀態(tài)
當(dāng)組件僅是接收 props,并將組件自身渲染到頁面時(shí),該組件就是一個(gè) "無狀態(tài)組件(stateless component)",可以使用一個(gè)純函數(shù)來創(chuàng)建這樣的組件。這種組件也被稱為啞組件(dumb components)或展示組件
(組件的)狀態(tài)(state)和屬性(props)之間有何不同State 是一種數(shù)據(jù)結(jié)構(gòu),用于組件掛載時(shí)所需數(shù)據(jù)的默認(rèn)值。State 可能會(huì)隨著時(shí)間的推移而發(fā)生突變,但多數(shù)時(shí)候是作為用戶事件行為的結(jié)果。
Props(properties 的簡寫)則是組件的配置。props 由父組件傳遞給子組件,并且就子組件而言,props 是不可變的(immutable)。組件不能改變自身的 props,但是可以把其子組件的 props 放在一起(統(tǒng)一管理)。Props 也不僅僅是數(shù)據(jù)--回調(diào)函數(shù)也可以通過 props 傳遞。
何為受控組件(controlled component)在 HTML 中,類似 , 和 這樣的表單元素會(huì)維護(hù)自身的狀態(tài),并基于用戶的輸入來更新。當(dāng)用戶提交表單時(shí),前面提到的元素的值將隨表單一起被發(fā)送。但在 React 中會(huì)有些不同,包含表單元素的組件將會(huì)在 state 中追蹤輸入的值,并且每次調(diào)用回調(diào)函數(shù)時(shí),如 onChange 會(huì)更新 state,重新渲染組件。一個(gè)輸入表單元素,它的值通過 React 的這種方式來控制,這樣的元素就被稱為"受控元素"。
何為高階組件(higher order component)高階組件是一個(gè)以組件為參數(shù)并返回一個(gè)新組件的函數(shù)。HOC 運(yùn)行你重用代碼、邏輯和引導(dǎo)抽象。最常見的可能是 Redux 的 connect 函數(shù)。除了簡單分享工具庫和簡單的組合,HOC 最好的方式是共享 React 組件之間的行為。如果你發(fā)現(xiàn)你在不同的地方寫了大量代碼來做同一件事時(shí),就應(yīng)該考慮將代碼重構(gòu)為可重用的 HOC。
為什么建議傳遞給 setState 的參數(shù)是一個(gè) callback 而不是一個(gè)對(duì)象因?yàn)?this.props 和 this.state 的更新可能是異步的,不能依賴它們的值去計(jì)算下一個(gè) state。
除了在構(gòu)造函數(shù)中綁定 this,還有其它方式嗎你可以使用屬性初始值設(shè)定項(xiàng)(property initializers)來正確綁定回調(diào),create-react-app 也是默認(rèn)支持的。在回調(diào)中你可以使用箭頭函數(shù),但問題是每次組件渲染時(shí)都會(huì)創(chuàng)建一個(gè)新的回調(diào)。
(在構(gòu)造函數(shù)中)調(diào)用 super(props) 的目的是什么在 super() 被調(diào)用之前,子類是不能使用 this 的,在 ES2015 中,子類必須在 constructor 中調(diào)用 super()。傳遞 props 給 super() 的原因則是便于(在子類中)能在 constructor 訪問 this.props。
應(yīng)該在 React 組件的何處發(fā)起 Ajax 請(qǐng)求在 React 組件中,應(yīng)該在 componentDidMount 中發(fā)起網(wǎng)絡(luò)請(qǐng)求。這個(gè)方法會(huì)在組件第一次“掛載”(被添加到 DOM)時(shí)執(zhí)行,在組件的生命周期中僅會(huì)執(zhí)行一次。更重要的是,你不能保證在組件掛載之前 Ajax 請(qǐng)求已經(jīng)完成,如果是這樣,也就意味著你將嘗試在一個(gè)未掛載的組件上調(diào)用 setState,這將不起作用。在 componentDidMount 中發(fā)起網(wǎng)絡(luò)請(qǐng)求將保證這有一個(gè)組件可以更新了。
描述事件在 React 中的處理方式。為了解決跨瀏覽器兼容性問題,您的 React 中的事件處理程序?qū)鬟f SyntheticEvent 的實(shí)例,它是 React 的瀏覽器本機(jī)事件的跨瀏覽器包裝器。
這些 SyntheticEvent 與您習(xí)慣的原生事件具有相同的接口,除了它們?cè)谒袨g覽器中都兼容。有趣的是,React 實(shí)際上并沒有將事件附加到子節(jié)點(diǎn)本身。React 將使用單個(gè)事件監(jiān)聽器監(jiān)聽頂層的所有事件。這對(duì)于性能是有好處的,這也意味著在更新 DOM 時(shí),React 不需要擔(dān)心跟蹤事件監(jiān)聽器。
createElement 和 cloneElement 有什么區(qū)別?React.createElement():JSX 語法就是用 React.createElement()來構(gòu)建 React 元素的。它接受三個(gè)參數(shù),第一個(gè)參數(shù)可以是一個(gè)標(biāo)簽名。如 div、span,或者 React 組件。第二個(gè)參數(shù)為傳入的屬性。第三個(gè)以及之后的參數(shù),皆作為組件的子組件。
React.createElement( type, [props], [...children] )
React.cloneElement()與 React.createElement()相似,不同的是它傳入的第一個(gè)參數(shù)是一個(gè) React 元素,而不是標(biāo)簽名或組件。新添加的屬性會(huì)并入原有的屬性,傳入到返回的新元素中,而就的子元素獎(jiǎng)杯替換。
React.cloneElement( element, [props], [...children] )React 中有三種構(gòu)建組件的方式
React.createClass()、ES6 class 和無狀態(tài)函數(shù)。
react 組件的劃分業(yè)務(wù)組件技術(shù)組件?根據(jù)組件的職責(zé)通常把組件分為 UI 組件和容器組件。
UI 組件負(fù)責(zé) UI 的呈現(xiàn),容器組件負(fù)責(zé)管理數(shù)據(jù)和邏輯。
兩者通過 React-Redux 提供 connect 方法聯(lián)系起來。
簡述 flux 思想Flux 的最大特點(diǎn),就是數(shù)據(jù)的"單向流動(dòng)"。
用戶訪問 View
View 發(fā)出用戶的 Action
Dispatcher 收到 Action,要求 Store 進(jìn)行相應(yīng)的更新
Store 更新后,發(fā)出一個(gè)"change"事件
View 收到"change"事件后,更新頁面
React 項(xiàng)目用過什么腳手架(本題是開放性題目)creat-react-app Yeoman 等
了解 redux 么,說一下 redux 把redux 是一個(gè)應(yīng)用數(shù)據(jù)流框架,主要是解決了組件間狀態(tài)共享的問題,原理是集中式管理,主要有三個(gè)核心方法,action,store,reducer,工作流程是 view 調(diào)用 store 的 dispatch 接收 action 傳入 store,reducer 進(jìn)行 state 操作,view 通過 store 提供的 getState 獲取最新的數(shù)據(jù),flux 也是用來進(jìn)行數(shù)據(jù)操作的,有四個(gè)組成部分 action,dispatch,view,store,工作流程是 view 發(fā)出一個(gè) action,派發(fā)器接收 action,讓 store 進(jìn)行數(shù)據(jù)更新,更新完成以后 store 發(fā)出 change,view 接受 change 更新視圖。Redux 和 Flux 很像。主要區(qū)別在于 Flux 有多個(gè)可以改變應(yīng)用狀態(tài)的 store,在 Flux 中 dispatcher 被用來傳遞數(shù)據(jù)到注冊(cè)的回調(diào)事件,但是在 redux 中只能定義一個(gè)可更新狀態(tài)的 store,redux 把 store 和 Dispatcher 合并,結(jié)構(gòu)更加簡單清晰
新增 state,對(duì)狀態(tài)的管理更加明確,通過 redux,流程更加規(guī)范了,減少手動(dòng)編碼量,提高了編碼效率,同時(shí)缺點(diǎn)時(shí)當(dāng)數(shù)據(jù)更新時(shí)有時(shí)候組件不需要,但是也要重新繪制,有些影響效率。一般情況下,我們?cè)跇?gòu)建多交互,多數(shù)據(jù)流的復(fù)雜項(xiàng)目應(yīng)用時(shí)才會(huì)使用它們
redux 有什么缺點(diǎn)一個(gè)組件所需要的數(shù)據(jù),必須由父組件傳過來,而不能像 flux 中直接從 store 取。
當(dāng)一個(gè)組件相關(guān)數(shù)據(jù)更新時(shí),即使父組件不需要用到這個(gè)組件,父組件還是會(huì)重新 render,可能會(huì)有效率影響,或者需要寫復(fù)雜的 shouldComponentUpdate 進(jìn)行判斷。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98928.html
摘要:特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 特意對(duì)前端學(xué)習(xí)資源做一個(gè)匯總,方便自己學(xué)習(xí)查閱參考,和好友們共同進(jìn)步。 本以為自己收藏的站點(diǎn)多,可以很快搞定,沒想到一入?yún)R總深似海。還有很多不足&遺漏的地方,歡迎補(bǔ)充。有錯(cuò)誤的地方,還請(qǐng)斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應(yīng)和斧正,會(huì)及時(shí)更新,平時(shí)業(yè)務(wù)工作時(shí)也會(huì)不定期更...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...
摘要:并總結(jié)經(jīng)典面試題集各種算法和插件前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快速搭建項(xiàng)目。 本文是關(guān)注微信小程序的開發(fā)和面試問題,由基礎(chǔ)到困難循序漸進(jìn),適合面試和開發(fā)小程序。并總結(jié)vue React html css js 經(jīng)典面試題 集各種算法和插件、前端視頻源碼資源于一身的文檔,優(yōu)化項(xiàng)目,在瀏覽器端的層面上提升速度,幫助初中級(jí)前端工程師快...
閱讀 3114·2021-09-22 15:20
閱讀 2628·2019-08-30 15:54
閱讀 1991·2019-08-30 14:06
閱讀 3149·2019-08-30 13:05
閱讀 2490·2019-08-29 18:36
閱讀 601·2019-08-29 15:10
閱讀 549·2019-08-29 11:17
閱讀 856·2019-08-28 18:11