問題一:當你調(diào)用setState時伺糠,發(fā)生了什么事?
當調(diào)用setState時略贮,react做的第一件事就是將傳遞給setState 的對象合并到組件的當前狀態(tài)蕴忆,這將啟動一個叫和解(reconciliation)的過程,和解的最終目的是以最有效的方式慰丛,根據(jù)這個新的狀態(tài)來更新UI卓囚,為此react將構建一個新的react元素樹(可以理解為UI的對象表示)
一旦有了這個樹,為了弄清UI如何響應新的狀態(tài)而改變诅病,react會將這個新樹與上一元素樹對比(diff)哪亿;
問題二:在react中elelment和component有什么區(qū)別。
簡單的說睬隶,一個react element描述了你想在屏幕上看到什么锣夹,換個說法,一個react element是一些UI的對象表示苏潜。
一個react component是一個函數(shù)或是一個類银萍。它可以接受輸入并返回一個react component(通常是通過jsx,被轉化成一個create Element調(diào)用)恤左。
問題三:什么時候在功能組件上使用類組件贴唇?
如果你的組件具有狀態(tài)或生命周期方法搀绣,請使用類組件,否則請用功能組件戳气。
問題四:什么是react的refs链患,為什么他們很重要?
refs就像是一個逃生艙口瓶您,允許你直接訪問dom元素或組件實例麻捻。為了使用他們,您可以向組件添加一個refs屬性呀袱,該屬性的值是一個回調(diào)函數(shù)贸毕,它將接受底層的dom元素或組件的已掛載實例,作為其第一個參數(shù):
class UnControlledForm extends Component{ handleSubmit = () => { console.log("Input Value: ",this.input.value) } render () {return( this.input = input} /> Submit ) }}
以上注意到我們的輸入字段有一個ref屬性夜赵,其值是一個函數(shù)明棍,該函數(shù)接收我們放在實例上的實際的dom元素,以便在handleSubmit內(nèi)部訪問它寇僧。經(jīng)常被誤解的是:您需要使用類組件才能使用ref摊腋,但ref也可以通過利用javascript中的閉包與功能組件一起使用。
問題五:react中的keys是什么嘁傀?為什么他們很重要兴蒸?
keys是什么?幫助react跟蹤那些項目已更改心包,添加或從列表中刪除类咧。
return(
<ul>
? ? ? {this.state.todoItems.map(({task, uid}) => {
return<li key={uid}>{task}</li>
? ? ? })}
</ul>
? )
每個keys在兄弟元素之間獨一無二的馒铃,我們已經(jīng)談過幾次關于和解(reconciliation)的過程蟹腾,而且這個和解過程中的一部分正在執(zhí)行一個新的元素樹與最前一個的差異,keys使處理列表時更加高效区宇,因為react可以使用子元素上的keys快速知道元素是新的還是在比較樹時才被移動娃殖。
而且keys不僅使這個過程更有效率,而且沒有keys议谷,react不知道那個本地狀態(tài)對應于移動中的哪個項目炉爆。所以在map中的時候,不應忽略keys.
問題六:看下面的代碼: 如果您在?下創(chuàng)建了一個 React 元素卧晓,?的組件定義將如何芬首?
如果你不熟悉渲染回調(diào)模式,這將看起來有點奇怪逼裆,在這種模式下郁稍,一個組件接收一個函數(shù)作為它的child。注意上面包含在標簽內(nèi)的內(nèi)容胜宇,?Twitter?組件的 child 是一個函數(shù)耀怜,而不是你曾經(jīng)習以為常的一個組件恢着。 這意味著在實現(xiàn)?Twitter?組件時,我們需要將?props.children?作為一個函數(shù)來處理财破。
importReact, {Component,PropTypes} from'react'importfetchUser from'twitter'classTwitterextendsComponent{ state = { user:null, } static propTypes = { username:PropTypes.string.isRequired, } componentDidMount () { fetchUser(this.props.username) .then((user) =>this.setState({user})) } render () {returnthis.props.children(this.state.user) }}
值得注意的是:正如我上邊提到的掰派,我通過調(diào)用它并傳遞給user來把props.children處理為一個函數(shù)。