您好,登錄后才能下訂單哦!
這篇文章給大家介紹props和state屬性怎么在React 中使用,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
props
不知道大家還記不記得xml標簽中的屬性,就像這樣:
<class id="1"> <student id="1">John Kindem</student> <student id="2">Alick Ice</student> </class>
這樣一個xml文件表達的意思是1班有兩個學生,學號為1的學生名字為John Kindem,學號為2的學生名字為Alick Ice,其中id就是屬性,你可以把它看做一個常量,它是只讀的。
html繼承自xml,而JSX從莫種意義上又是html和js的擴展,屬性的概念自然得到了傳承。
在React中,我們使用props這一概念向React組件傳遞只讀的值,就像這樣:
// 假設我們已經(jīng)自定義了一個叫Hello的組件 ReactDom.render( <Hello firstName={'John'} lastName={'Kindem'}/>, document.getElementById('root') );
在調(diào)用React組件的時候,我們可以像上面一樣向組件傳遞一些常量,以便組件在內(nèi)部調(diào)用。而調(diào)用的方法,就像下面這樣:
class Hello extends React.Component { constructor(props) { super(props); } render() { return ( <div> <h2>Hello, {this.props.firstName + ' ' + this.props.lastName}</h2> </div> ); } } ReactDom.render( <Hello firstName={'John'} lastName={'Kindem'}/>, document.getElementById('root') );
在組件內(nèi)部獲取傳遞過來的props,只需要使用this.props對象即可,但是在使用之前,記得復寫組件的構造函數(shù),并且接受props的值以調(diào)用父類構造。
當然,props也能夠設置默認值,向下面這樣:
class Hello extends React.Component { constructor(props) { super(props); } static defaultProps = { firstName: 'John', lastName: 'Kindem' }; render() { return ( <div> <h2>Hello, {this.props.firstName + ' ' + this.props.lastName}</h2> </div> ); } } ReactDom.render( <Hello/>, document.getElementById('root') );
只需在ES6類中聲明一個static的props默認值即可,運行效果和上面一樣。
props沒有多復雜,稍微練習即可習得。
state、組件生命周期
你可能回想,如果我想在React組件中添加動態(tài)效果怎么辦?目前學過的知識好像無法解決這一問題。
這一問題需要使用React組件的state來解決,state即狀態(tài)的意思,在React中,所有會變化的控制變量都應該放入state,每當state中的內(nèi)容變化時,頁面的相應組件將會被重新渲染,另外,state完全是組件內(nèi)部的東西,外部無法向內(nèi)部傳遞state,也無法直接改變state的值。
先來舉一個例子:
import React from 'react'; import ReactDom from 'react-dom'; class Time extends React.Component { constructor(props) { super(props); // 初始化state this.state = { hour: 0, minute: 0, second: 0 } } componentDidMount() { this.interval = setInterval(() => this.tick(), 1000); } componentWillUnmount() { clearInterval(this.interval); } tick() { // 計算新時間 let newSecond, newMinute, newHour; let carryMinute = 0, carryHour = 0; newSecond = this.state.second + 1; if (newSecond > 59) { carryMinute = 1; newSecond -= 60; } newMinute = this.state.minute + carryMinute; if (newMinute > 59) { carryHour = 1; newMinute -= 60; } newHour = this.state.hour + carryHour; if (newHour > 59) newHour -= 60; // 設置新狀態(tài) this.setState({ hour: newHour, minute: newMinute, second: newSecond }); } render() { return ( <div> <h2>current time: {this.state.hour + ':' + this.state.minute + ':' + this.state.second}</h2> </div> ); } } ReactDom.render( <Time/>, document.getElementById('root') );
這樣就完成了一個計數(shù)器,數(shù)值一秒鐘變化一次,來講解一下代碼:首先,state的初始化是在構造函數(shù)中,像這樣:
constructor(props) { super(props); // 在這初始化state this.state = { ... } }
而改變state是使用React組件基類中的一個自帶函數(shù):
this.setState({ ... });
使用這個函數(shù)之前一定要注意this的作用域,箭頭函數(shù)中的this指向外部this,而普通函數(shù)中的this指向函數(shù)本身。
另外,這里使用到了兩個React組件的生命周期回調(diào):
componentDidMount() { // React組件被加載到dom中的時候被調(diào)用 ... } componentWillUnmount() { // React組件從dom中卸載的時候被調(diào)用 ... }
所以這樣一下上面的計時器代碼應該就不是什么難事了,在React組件被加載到dom中的時候設置一個計時器,每秒鐘更新一次state,state更新的同時頁面中的組件將會被重新渲染,而當組件被卸載的時候,則需要清除定時器,就那么簡單。
不過React對于state的更新頻率,有一個最大的限度,超過這個限度則會導致頁面渲染的性能下降,大家需要注意不要在高頻函數(shù)中使用setState。
關于props和state屬性怎么在React 中使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。