- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > web開(kāi)發(fā) > JavaScript >
- React如何創(chuàng )建組件
這節我們將介紹 React 中組件的類(lèi)別,以及如何創(chuàng )建和使用組件。
本文會(huì )向你介紹以下內容:
組件(Components) 讓你可以將用戶(hù)界面分成獨立的,可復用的小部件,并可以對每個(gè)部件進(jìn)行單獨的設計。
從定義上來(lái)說(shuō), 組件就像JavaScript的函數。組件可以接收任意輸入(稱(chēng)為”props”), 并返回 React 元素,用以描述屏幕顯示內容。
Props , 即屬性(Property), 在代碼中寫(xiě)作 props,故可用 props 指代 properties。
react中有兩種組件:類(lèi)組件(class components)、函數組件(function components)
類(lèi)組件的定義有如下要求:
在ES6之前,可以通過(guò)create-react-class 模塊來(lái)定義類(lèi)組件,但是目前官網(wǎng)建議我們使用ES6的class類(lèi)定義。
使用class定義一個(gè)組件:
class App extends Component { constructor() { super() this.state = {} } render() { return <h2>Hello App</h2> } }
我們來(lái)詳細分析一下類(lèi)組件有哪幾個(gè)部分
我們可以通過(guò)this.state給類(lèi)組件添加數據對象,我們可以通過(guò)this.state.<屬性名>去訪(fǎng)問(wèn)我們setState中的屬性。
constructor(props) { super(props); this.state = { name:"xhs-rookies" } } render(){ return <h2>{this.state.name}</h2> }
但是我們想要修改上述例子中的name屬性的時(shí)候,則必須通過(guò)react給我們規定好的setState()方法,去給state添加或者修改其中的數值。
this.state.name = 'new xhs-rookies' //錯誤的方式,不允許采用 this.setState({ name: 'new xhs-rookies' }) //正確的方式
簡(jiǎn)單點(diǎn)來(lái)說(shuō),在 react 中頁(yè)面是通過(guò)數據進(jìn)行渲染,使用setState()更新的數據,react 會(huì )幫我們執行render()去更新頁(yè)面,從而將頁(yè)面中用到 state 中的數據全部更新。
當 render 被調用時(shí),它會(huì )檢查 this.props 和 this.state 的變化并返回很多類(lèi)型,很多時(shí)候我們選擇讓該方法返回 React 元素,然后交由 React 去渲染展示:
React 元素:
詳細關(guān)于 render() 方法的內容請見(jiàn)
函數組件是使用 function 來(lái)進(jìn)行定義的函數,只是這個(gè)函數會(huì )返回和類(lèi)組件中 render 函數返回一樣的內容。
跟類(lèi)組件相比,函數組件有自己的特點(diǎn):
我們來(lái)定義一個(gè)函數組件:
export default function App() { return <div>xhs rookies</div> }
在前幾篇中, 我們只遇到代表 DOM 標簽的 React 元素:
const element = <div />
然而,元素也可以代表用戶(hù)定義的組件:
const element = <Welcome name="xhs rookies" />
當 React 遇到一個(gè)代表用戶(hù)定義組件的元素時(shí),它將 JSX 屬性以一個(gè)單獨對象的形式傳遞給相應的組件。 我們將其稱(chēng)為 “props” 對象。
比如, 以下代碼在頁(yè)面上渲染“xhs rookies”:
function Welcome(props) { return <h1>Hello, {props.name}</h1> } const element = <Welcome name="xhs rookies" /> ReactDOM.render(element, document.getElementById('root'))
我們簡(jiǎn)單解釋一下上面這個(gè)例子:
注意: 組件名稱(chēng)總是以大寫(xiě)字母開(kāi)始。
舉例來(lái)說(shuō), <div/> 代表一個(gè) DOM 標簽,而 <Welcome/> 則代表一個(gè)組件,并且需要在作用域中有一個(gè) Welcome 組件。
你可以深入 JSX閱讀更多關(guān)于這點(diǎn)背后的原因。
組件可以在它們的輸出中引用其它組件。這使得我們可以使用同樣的組件來(lái)抽象到任意層級。一個(gè)按鈕,一個(gè)表單,一個(gè)對話(huà)框,一個(gè)屏幕:在 React 應用中,所有這些都通常描述為組件。
例如,我們可以創(chuàng )建一個(gè) App 組件,并在其內部多次渲染 Welcome:
function Welcome(props) { return <h1>Hello, {props.name}</h1> } function App() { return ( <div> <Welcome name="rookie-Sara" /> <Welcome name="rookie-Cahal" /> <Welcome name="rookie-Edite" /> </div> ) } ReactDOM.render(<App />, document.getElementById('root'))
通常,新的 React apps 都有一個(gè)單獨的頂層 App 組件。然而,如果你在已有的應用中整合 React,你可以需要由下至上地, 從類(lèi)似于 Button 這樣的小組件開(kāi)始, 逐漸整合到視圖層的頂層。
不要害怕把一個(gè)組件分為多個(gè)更小的組件。
舉個(gè)例子,思考下名 Comment 組件:
function Comment(props) { return ( <div className="Comment"> <div className="UserInfo"> <img className="Avatar" src={props.author.avatarUrl} alt={props.author.name} /> <div className="UserInfo-name">{props.author.name}</div> </div> <div className="Comment-text">{props.text}</div> <div className="Comment-date">{formatDate(props.date)}</div> </div> ) }
它接受 author(一個(gè)對象),text(一個(gè)字符串)和 date(一個(gè)日期)作為 props。
這個(gè)組件修改起來(lái)很麻煩,因為它是被嵌套的,而且很難復用其中的某個(gè)部分。讓我們從其中提取一些組件。
首先,提取頭像 Avatar:
function Avatar(props) { return <img className="Avatar" src={props.user.avatarUrl} alt={props.user.name} /> }
Avatar 組件不用關(guān)心它在 Comment 中是如何渲染的。這是為什么我們它的 prop 一個(gè)更通用的屬性名: user, 而不是 author 的原因。
我們建議從組件本身的角度來(lái)命名 props 而不是它被使用的上下文環(huán)境。
我們可以稍微簡(jiǎn)化一下 Comment 組件:
function Comment(props) { return ( <div className="Comment"> <div className="UserInfo"> <Avatar user={props.author} /> <div className="UserInfo-name">{props.author.name}</div> </div> <div className="Comment-text">{props.text}</div> <div className="Comment-date">{formatDate(props.date)}</div> </div> ) }
接下來(lái),我們提取用戶(hù)信息 UserInfo 組件, 用于將 Avatar 顯示在用戶(hù)名旁邊:
function UserInfo(props) { return ( <div className="UserInfo"> <Avatar user={props.user} /> <div className="UserInfo-name">{props.user.name}</div> </div> ) }
這使我們可以進(jìn)一步簡(jiǎn)化 Comment 組件:
function Comment(props) { return ( <div className="Comment"> <UserInfo user={props.author} /> <div className="Comment-text">{props.text}</div> <div className="Comment-date">{formatDate(props.date)}</div> </div> ) }
提取組件可能看起來(lái)是一個(gè)繁瑣的工作,但是在大型的 Apps 中可以回報給我們的是大量的可復用組件。一個(gè)好的經(jīng)驗準則是如果你 UI 的一部分需要用多次 (Button,Panel,Avatar),或者本身足夠復雜(App,FeedStory,Comment),最好的做法是使其成為可復用組件。
無(wú)論你用函數或類(lèi)的方法來(lái)聲明組件, 它都無(wú)法修改其自身 props. 思考下列 sum (求和)函數:
function sum(a, b) { return a + b }
這種函數稱(chēng)為 “” ,因為它們不會(huì )試圖改變它們的輸入,并且對于同樣的輸入,始終可以得到相同的結果。
反之, 以下是非純函數, 因為它改變了自身的輸入值:
function withdraw(account, amount) { account.total -= amount }
雖然 React 很靈活,但是它有一條嚴格的規則:
注意: 所有 React 組件都必須是純函數,并禁止修改其自身 props 。
當然, 應用 UI 總是動(dòng)態(tài)的,并且隨時(shí)有可以改變。
如果我們想要動(dòng)態(tài)改變 UI,那么就會(huì )涉及到我們上面說(shuō)到的state(狀態(tài)) 。我們通過(guò)動(dòng)態(tài)的改變state來(lái)渲染整個(gè)頁(yè)面,我們后面會(huì )提及,詳情見(jiàn) 深入理解 setState
到此這篇關(guān)于React如何創(chuàng )建組件的文章就介紹到這了,更多相關(guān)React 創(chuàng )建組件內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站