您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“React的三大屬性是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“React的三大屬性是什么”這篇文章吧。
組件是封閉的,接收外部數(shù)據(jù)應(yīng)該通過props來實現(xiàn)
函數(shù)組件通過參數(shù)props來接收數(shù)據(jù),props是一個對象; 類組件通過this.props接收數(shù)據(jù)。
傳遞數(shù)據(jù):在組件標簽上添加屬性
const Hello = (props) => { console.log(props); return ( <div>props:{props.name}</div> ) } ReactDOM.render(<Hello name="mimi" />, document.getElementById('root'))
class App extends React.Component { render() { console.log(this.props); return ( <div> props: {this.props.name} </div> ) } } ReactDOM.render(<App name="mimi" />, document.getElementById('root'))
在繼承類的構(gòu)造函數(shù)中必須調(diào)用super函數(shù),super代表父類的構(gòu)造函數(shù)。ES6 要求,子類的構(gòu)造函數(shù)必須執(zhí)行一次super函數(shù),否則會報錯。但是super函數(shù)內(nèi)的this指向的是當前類的實例。
構(gòu)造器是否接受 props,是否傳遞給 super,取決于是否希望在構(gòu)造器中通過 this訪問props。
當構(gòu)造器中接收了props參數(shù),super沒有傳遞props,此時this.props
是undefined
,當然可以正常使用props(前邊不加this)
當構(gòu)造器中接收了props參數(shù),super也傳遞props,可以通過this.props拿到對象。
原因:類組件會繼承React.Component
,而Component的源碼是:
function Component(props, context, updater) { this.props = props; //綁定props this.context = context; //綁定context this.refs = emptyObject; //綁定ref this.updater = updater || ReactNoopUpdateQueue; //上面所屬的updater 對象 }
當我們在類組件中調(diào)用super,實際上是在執(zhí)行父類的構(gòu)造函數(shù),如果沒有將props傳入super函數(shù),那么在子類的構(gòu)造函數(shù)中,this.props是undefined。
為什么仍然可以在 render和其他方法中訪問 this.props
。因為React 會在構(gòu)造函數(shù)被調(diào)用之后,會把 props 賦值給剛剛創(chuàng)建的實例對象。
函數(shù)組件又叫做無狀態(tài)組件,函數(shù)組件沒有自己的狀態(tài),只負責(zé)數(shù)據(jù)的靜態(tài)展示。
類組件又叫做有狀態(tài)組件,類組件有自己的狀態(tài),負責(zé)更新UI,讓頁面動起來。
狀態(tài)(state)就是數(shù)據(jù),是組件內(nèi)部的私有數(shù)據(jù),只能在組件內(nèi)部使用。
每個組件都有state,它的值是對象類型;組件state屬性的初始化放在構(gòu)造方法中。
class App extends React.Component { constructor() { super(); // 初始化state this.state = { count: 0 } } render() { return ( <div>計數(shù)器:{this.state.count}</div> ) } } ReactDOM.render(<App2 />, document.getElementById('root'))
狀態(tài)是可變的:this.setState({要修改的數(shù)據(jù)})
注意不要直接通過this.state.x = y 修改state中的數(shù)據(jù),這是錯誤的寫法.
etState的作用:
1. 修改state
2. 更新UI
執(zhí)行setState()的位置?
在react控制的回調(diào)函數(shù)中: (異步)
生命周期勾子 ,react事件監(jiān)聽回調(diào)(合成事件)
非react控制的異步回調(diào)函數(shù)中: (同步)
定時器回調(diào) ,原生事件監(jiān)聽回調(diào) , promise回調(diào)
setState是異步還是同步?
setState
的“異步”并不是說內(nèi)部由異步代碼實現(xiàn),其實本身執(zhí)行的過程和代碼都是同步的。只是在 React 的 setState
函數(shù)實現(xiàn)中,會根據(jù) isBatchingUpdates
(默認是 false) 變量判斷是否直接更新 this.state
還是放到隊列中稍后更新。然后有一個 batchedUpdate
函數(shù),可以修改 isBatchingUpdates
為 true,當 React 調(diào)用事件處理函數(shù)之前,或者生命周期函數(shù)之前就會調(diào)用 batchedUpdate
函數(shù),這樣的話,setState 就不會同步更新 this.state,而是放到更新隊列里面后續(xù)更新。
這樣你就可以理解為什么原生事件和 setTimeout/setinterval
里面調(diào)用 this.state 會同步更新了,因為通過這些函數(shù)調(diào)用的 React 沒辦法去調(diào)用 batchedUpdate 函數(shù)將 isBatchingUpdates 設(shè)置為 true,那么這個時候 setState 的時候默認就是 false,那么就會同步更新。
props 是組件對外的接口,state 是組件對內(nèi)的接口。
主要區(qū)別:
State是可變的,是一組用于反映組件UI變化的狀態(tài)集合。
而Props對于使用它的組件來說,是只讀的,要想修改Props,只能通過該組件的父組件修改。
refs是彈性文件系統(tǒng),在React中可以獲取React元素或DOM元素。
我們在日常寫React代碼的時候,一般情況是用不到Refs這個東西,因為我們并不直接操作底層DOM元素,而是在render函數(shù)里去編寫我們的頁面結(jié)構(gòu),由React來組織DOM元素的更新。凡事總有例外,總會有一些很奇葩的時候我們需要直接去操作頁面的真實DOM,這就要求我們有直接訪問真實DOM的能力,而Refs就是為我們提供了這樣的能力。
React.createRef調(diào)用后可以返回一個容器,該容器可以存儲被ref所標識的節(jié)點,該容器是專人專用的:
class App extends React.Component { inputRef = React.createRef(); showData = () => { let input = this.inputRef.current; console.log(input.value) } render() { return ( <div> <input ref={this.inputRef} type="text" /> <button onClick={this.showData}>提示</button> </div> ) } }
class Person extends React.Component{ constructor(){ super(); this.handleClick = this.handleClick.bind(this); } handleClick(){ // 使用原生的 DOM API 獲取焦點 this.refs.myInput.focus(); } render(){ return ( <div> <input type="text" ref="myInput" /> <input type="button" value="點我輸入框獲取焦點" onClick={this.handleClick}/> </div> ); } } ReactDOM.render(<Person />, document.getElementById('root'));
當 ref 屬性用于 HTML 元素時,使用 React.createRef()或者React.useRef() 創(chuàng)建的 ref 接收底層 DOM 元素作為其 current 屬性。
當 ref 屬性用于 class 組件時,ref 對象接收組件的掛載實例作為其 current 屬性。
你不能在函數(shù)組件上使用 ref 屬性,因為他們沒有實例。函數(shù)組件可以使用useRef(),它所返回的對象在組件的整個生命周期內(nèi)不變。
以上是“React的三大屬性是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。