摘要:例如下面的代碼組件生命周期鉤子函數在組件掛載完成后立即被調用組件掛載完成渲染結果以上就是一個常規的組件編寫方式,不過我們還可以通過觀察上面的代碼,發現幾個有趣的地方中有一個函數是組件生命周期鉤子函數。
如何編寫一個React組件
在React的世界里,通常是用class來聲明一個組件的,它必須繼承自React.Component。
例如下面的代碼:
// MyFirstComponent.jsx class MyFirstComponent extends React.Component { state = { text: "Hello React" }; /** 組件生命周期鉤子函數:在組件掛載完成后立即被調用 */ componentDidMount() { alert("組件掛載完成!"); } render() { return ({this.state.text}, I am {this.props.author}!) } } export default MyFirstComponent;
// index.js import MyFirstComponent from "MyFirstComponent"; /** 渲染結果:Hello React, I am Shaye!*/ ReactDOM.render(, document.getElementById("app"));
以上就是一個常規的React組件編寫方式,不過我們還可以通過觀察上面的代碼,發現幾個有趣的地方:
MyFirstComponent中有一個函數componentDidMount是組件生命周期鉤子函數。實際上React為組件設計了一系列的生命周期鉤子函數
MyFirstComponent中有一個特別的函數render(),這個函數把類似html的模板內容jsx作為返回值。這是一個必須定義的函數,否則React將拋出錯誤
jsx乍看之下像是一種模板引擎,實際上是一種JavaScript的語法擴展,它的核心理念就是著名的all in js,它完全是在JavaScript內部實現的,它和傳統的模板引擎一樣,也可以綁定js表達式
jsx綁定的數據可以很明顯地看出來自兩個對象:this.state和this.props;this.state是MyFirstComponent內部自定義的組件狀態;this.props是外部憑借標簽屬性的形式傳進MyFirstComponent內部的數據,類似于函數的傳參;
總結來說,當你掌握了???組件生命周期???JSX???組件狀態state???組件屬性props???,你就知道該如何編寫React組件了。
組件生命周期官方文檔已經有非常詳盡的介紹,這里不再贅述,請點擊這里查看組件生命周期的官方文檔。
JSX你可以任意地在JSX當中使用javaScript表達式,在JSX當中的表達式要包含在大括號里。
例如下面的代碼:
{this.state.content} forever
JSX里的React元素,比如div,最終都會被編譯器轉譯,被某些特定函數處理變成一個輕量的javascript object。比如上面提到的元素div最終會變成如下的object:
// 注意: 以下示例是簡化過的(不代表在 React 源碼中是這樣) const divElement = { type: "div", props: { // this.state.clname的值 className: "love", style: { fontSize: "20px" }, // "you"為this.state.content的值 children: ["you", "forever"] } }
React就是通過讀取這些對象來操作DOM并保持數據內容一致。所以,實際上你依然在寫js。所以,class和style必須使用在js中的寫法
比如:class => className
再比如:font-size: 20px; => { fontSize: "20px" }
特別地,React元素的屬性仍然可以像原生html一樣使用引號來定義以字符串為值的屬性,例如:className="my-claname"
除了以上所提,JSX的事件綁定與原生html也有一些語法上的不同:
React的事件命名采用駝峰式寫法,而不是小寫。
React事件綁定的必須是一個函數對象,不能是字符串。
代碼示例:
組件狀態state我是一個按鈕// 也可以向事件回調函數傳遞參數this.handleClick(params)}>我是一個按鈕
state是私有的,完全受控于當前組件。既然是狀態,那么就會有更新的需求,如何更新呢?
代碼示例:
// 對`this.state`或者它的屬性直接`=`賦值,將永遠不會觸發組件渲染,必須使用`setState()` // 在組件的生命周期鉤子函數中調用this.setState() componentDidMount() { this.setState({ content: "lalalala" }) } // 在組件的自定義函數中調用this.setState() handleClick = () => { this.setState({ content: "uauauaua" }) }
setState()是React中唯一一個動態更新組件的途徑,當它被調用之后,自身組件以它的所有子組件都將觸發重渲染
特別地,state同樣也可以作為屬性傳遞給子組件;
setState()詳細文檔
props是父組件傳遞下來的數據,一般是來自父組件的state或者組件的其他成員變量。并且,props是只讀的,組件永遠無法修改自己的props。只有在父組件調用setState()之后才能使子組件的屬性發生變化并重新渲染。
props只能從上往下傳,組件也只能修改自身私有的state,意味著整個應用的數據流只能是自上往下的單向數據流
???組件生命周期???JSX???組件狀態state???組件屬性props??? 再加上一個自上而下的單向數據流,這些便是React組件最基本的特點了吧!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97638.html
摘要:受控組件例假設有一個方法非受控組件例接下來我們來看下如果編寫這兩種組件,打個比方我們要自定義一個組件。于是修改后的代碼如下確定使用這個組件的代碼以上就是兩種組件的編寫思路,你可以選擇把你的組件編寫成任意一種,那么使用者使用時也會有所不同。 新手寫 React 組件往往無從入手,怎么寫,什么時候用 props,什么時候用 state 摸不著頭腦。其實是沒有了解到 React 的一些思想。...
摘要:幸運的是,組合易于理解。組件的組合是自然而然的。高效用戶界面可組合的層次結構,因此,組件的組合是一種構建用戶界面的有效的方式。這個原則建議避免重復。只有一個組件符合單一責任原則并且具有合理的封裝時,它是可復用的。 翻譯:劉小夕原文鏈接:https://dmitripavlutin.com/7-... 原文的篇幅非常長,不過內容太過于吸引我,還是忍不住要翻譯出來。此篇文章對編寫可重用和...
摘要:與大多數全局對象不同,沒有構造函數。為什么要設計更加有用的返回值早期寫法寫法函數式操作早期寫法寫法可變參數形式的構造函數一般寫法寫法當然還有很多,大家可以自行到上查看什么是代理設計模式代理模式,為其他對象提供一種代理以控制對這個對象的訪問。 這是專門探索 JavaScript 及其所構建的組件的系列文章的第 19 篇。 如果你錯過了前面的章節,可以在這里找到它們: 想閱讀更多優質文章請...
摘要:本文轉載自眾成翻譯譯者鏈接原文今天,我們從一開始就開始。讓我們看看是什么,是什么讓運轉起來。什么是是一個用于構建用戶界面的庫。它是應用程序的視圖層。所有應用程序的核心是組件。組件是可組合的。虛擬完全存在于內存中,并且是網絡瀏覽器的的表示。 本文轉載自:眾成翻譯譯者:iOSDevLog鏈接:http://www.zcfy.cc/article/3765原文:https://www.ful...
摘要:組件的職責增長并變得不可分割。是架構的重要組成部分。有許多好處,但它們為初學者創造了入門的障礙。方法使用狀態鉤子的最好方法是對其進行解構并設置原始值。第一個參數將用于存儲狀態,第二個參數用于更新狀態。 學習目標 在本文結束時,您將能夠回答以下問題: 什么是 hooks? 如何使用hooks? 使用hooks的一些規則? 什么是custom hook(自定義鉤子)? 什么時候應該使用 ...
閱讀 2628·2021-11-23 09:51
閱讀 2418·2021-09-30 09:48
閱讀 2044·2021-09-22 15:24
閱讀 1009·2021-09-06 15:02
閱讀 3303·2021-08-17 10:14
閱讀 1934·2021-07-30 18:50
閱讀 1980·2019-08-30 15:53
閱讀 3168·2019-08-29 18:43