前端中階學(xué)習(xí)路線(二)React入門與實(shí)踐(筆記)

本文是作為一個(gè)幾乎不了解一系列框架工具的小白的入門筆記,也為與我一樣面對(duì)框架工具迷茫不知道如何學(xué)起如何構(gòu)建項(xiàng)目的同學(xué)們提供一條學(xué)習(xí)路線杏愤。
具體學(xué)習(xí)內(nèi)容參考貼出的鏈接左医,本文更多的是筆記扛禽。
我認(rèn)為較好的學(xué)習(xí)路線是先學(xué)習(xí)基礎(chǔ)(第一熟妓、二部分貼出的教程),然后是一個(gè)項(xiàng)目的組建過程慈俯、思路(第三部分)渤刃,然后是動(dòng)手跟著教程做一遍框架的搭建與項(xiàng)目建立(第四部分)。
這之后將繼續(xù)學(xué)習(xí)webpack和es6贴膘。


第一部分:react基礎(chǔ)

參考React 入門實(shí)例教程
筆記:

  • 最后一個(gè) <script> 標(biāo)簽的 type 屬性為 text/babel 卖子。這是因?yàn)?React 獨(dú)有的 JSX 語法,跟 JavaScript 不兼容刑峡。凡是使用 JSX 的地方洋闽,都要加上 type="text/babel" 玄柠。
  • ReactDOM.render 是 React 的最基本方法,用于將模板轉(zhuǎn)為 HTML 語言诫舅,并插入指定的 DOM 節(jié)點(diǎn)羽利。
  • JSX允許 HTML 與 JavaScript 的混寫。 JSX 的基本語法規(guī)則:遇到 HTML 標(biāo)簽(以 < 開頭)刊懈,就用 HTML 規(guī)則解析这弧;遇到代碼塊(以 { 開頭),就用 JavaScript 規(guī)則解析虚汛。插入的變量是一個(gè)數(shù)組匾浪,則會(huì)展開這個(gè)數(shù)組的所有成員
  • React.createClass 方法就用于生成一個(gè)組件類,然后插入網(wǎng)頁中卷哩。然后用<xxx />生成組件實(shí)例蛋辈。實(shí)例內(nèi)可以放入屬性。組件的屬性可以在組件類的 this.props 對(duì)象上獲取将谊。
    組件類只能包含一個(gè)頂層標(biāo)簽冷溶,否則也會(huì)報(bào)錯(cuò)。組件類的第一個(gè)字母必須大寫
  • 添加組件屬性尊浓,有一個(gè)地方需要注意逞频,就是 class 屬性需要寫成 className ,for 屬性需要寫成 htmlFor 眠砾,這是因?yàn)?class 和 for 是 JavaScript 的保留字虏劲。
  • this.props.children 屬性托酸。它表示組件的所有子節(jié)點(diǎn)褒颈。this.props.children的值有三種可能:如果當(dāng)前組件沒有子節(jié)點(diǎn),它就是 undefined ;如果有一個(gè)子節(jié)點(diǎn)励堡,數(shù)據(jù)類型是 object 谷丸;如果有多個(gè)子節(jié)點(diǎn),數(shù)據(jù)類型就是 array 应结。所以刨疼,處理 this.props.children的時(shí)候要小心。React 提供一個(gè)工具方法 [React.Children] 來處理 this.props.children 鹅龄。我們可以用 React.Children.map 來遍歷子節(jié)點(diǎn)揩慕,而不用擔(dān)心 this.props.children的數(shù)據(jù)類型是 undefined 還是 object。
  • 組件類的PropTypes屬性扮休,就是用來驗(yàn)證組件實(shí)例的屬性是否符合要求迎卤。getDefaultProps 方法可以用來設(shè)置組件屬性的默認(rèn)值。
  • 用組件插入的都是虛擬的dom玷坠,無法獲得用戶輸入蜗搔,在需要真實(shí)dom的場(chǎng)景下劲藐,必須為組件的子節(jié)點(diǎn)添加ref屬性然后 this.refs.[refName] 就會(huì)返回這個(gè)真實(shí)的 DOM 節(jié)點(diǎn)。必須等到虛擬 DOM 插入文檔以后樟凄,才能使用這個(gè)屬性聘芜,否則會(huì)報(bào)錯(cuò)。
  • getInitialState 方法用于定義初始狀態(tài)缝龄,也就是一個(gè)對(duì)象汰现,這個(gè)對(duì)象可以通過 this.state 屬性讀取。當(dāng)用戶點(diǎn)擊組件二拐,導(dǎo)致狀態(tài)變化服鹅,this.setState 方法就修改狀態(tài)值,每次修改以后百新,自動(dòng)調(diào)用 this.render 方法企软,再次渲染組件。由于 this.props 和 this.state 都用于描述組件的特性饭望,可能會(huì)產(chǎn)生混淆仗哨。一個(gè)簡單的區(qū)分方法是,this.props 表示那些一旦定義铅辞,就不再改變的特性厌漂,而 this.state 是會(huì)隨著用戶互動(dòng)而產(chǎn)生變化的特性。
  • 文本輸入框的值斟珊,不能用 this.props.value 讀取苇倡,而要定義一個(gè) onChange 事件的回調(diào)函數(shù),通過 event.target.value 讀取用戶輸入的值囤踩。textarea 元素旨椒、select元素、radio元素都屬于這種情況
  • 組件生命周期分為3種:已插入堵漱、已移除综慎、重新渲染。React 為每個(gè)狀態(tài)都提供了兩種處理函數(shù)will和did勤庐,一個(gè)是進(jìn)入狀態(tài)之前調(diào)用示惊,一個(gè)是進(jìn)入狀態(tài)后進(jìn)入狀態(tài)之前調(diào)用。 還提供兩種特殊狀態(tài)的處理函數(shù)愉镰。
    componentWillReceiveProps(object nextProps):已加載組件收到新的參數(shù)時(shí)調(diào)用
    shouldComponentUpdate(object nextProps, object nextState):組件判斷是否重新渲染時(shí)調(diào)用
  • 組件的style屬性的設(shè)置方式也值得注意米罚,不能寫成style="opacity:{this.state.opacity};"而要寫成style={{“opacity”: this.state.opacity}}

第二部分:創(chuàng)建react項(xiàng)目

參考:React 教程
筆記:

  • 創(chuàng)建項(xiàng)目:
$ create-react-app my-app
$ cd my-app/
$ npm start```
- 元素添加自定義屬性需要使用 data- 前綴
- 在 JSX 中使用 JavaScript 表達(dá)式。表達(dá)式寫在花括號(hào) {} 中
- 在 JSX 中不能使用 if else 語句丈探,但可以使用 conditional (三元運(yùn)算) 表達(dá)式來替代录择。
- React 推薦使用內(nèi)聯(lián)樣式。我們可以使用 camelCase 語法來設(shè)置內(nèi)聯(lián)樣式. React 會(huì)在指定元素?cái)?shù)字后自動(dòng)添加 px 。注釋需要寫在花括號(hào)中{/*注釋...*/}
- 不能在組件內(nèi)部通過this.state修改狀態(tài)糊肠,因?yàn)樵摖顟B(tài)會(huì)在調(diào)用setState()后被替換辨宠。
- 一些組件api參考[React組件API](http://www.runoob.com/react/react-component-api.html)
這里有一個(gè)[3分鐘創(chuàng)建一個(gè)hello world react程序](https://daveceddia.com/test-drive-react/)
---
###第三部分:實(shí)踐
參考[十分詳細(xì)的React入門實(shí)例](https://link.zhihu.com/?target=http%3A//blog.csdn.net/a153375250/article/details/52667739)
內(nèi)含代碼下載,以及詳盡的代碼解釋货裹。主要是理解一個(gè)項(xiàng)目的搭建思路嗤形。
筆記:
- 用`export default class StaffItem extends React.Component`來替代`React.createClass`
- 綁定函數(shù)用法類似于`onChange={this.handlerOrderChange.bind(this)}`
- 利用在組件中添加ref屬性來抓住dom,調(diào)用時(shí)弧圆,使用`React.findDOMNode(this.refs.xxx);`獲取下拉選項(xiàng)的值: `sel.options[sel.selectedIndex].value;`
- 寫完源碼后放入src文件夾中赋兵,寫好webpack.config.js和package.json,運(yùn)行npm install和npm start,在build中生成bundle.js搔预,將其引入index.html中即可打開項(xiàng)目霹期。
---
###第四部分:實(shí)戰(zhàn)
參考[Learn React & Webpack by building the Hacker News front page](https://github.com/theJian/build-a-hn-front-page)

這篇文章感覺比較好,因?yàn)閷?duì)于我個(gè)人來說一開始對(duì)于webpack等工具的使用都是一頭霧水拯田,很多實(shí)踐教程一上來就默認(rèn)初學(xué)者已經(jīng)懂了實(shí)際不然历造,這個(gè)教程算是手把手教你如何創(chuàng)建一個(gè)項(xiàng)目并且跑起來。
流程:
- 先安裝webpack和webpack服務(wù)器
```npm install webpack -g
npm install webpack-dev-server -g```
- 創(chuàng)建webpack配置文件
- 在根目錄下運(yùn)行`npm init -y`創(chuàng)建package.json文件船庇,修改鍵值
```"scripts": {
  "start": "webpack-dev-server",
  "build": "webpack"
}```
- 安裝react和jquery吭产、babel
```npm install react react-dom --save
npm install jquery --save
npm install babel-core babel-loader babel-preset-es2015 babel-preset-react --save-dev```
- 修改webpack配置文件:

var path = require('path');
module.exports = {
entry: path.resolve(__dirname, 'app/app.js'),
output: {
path: path.resolve(__dirname, 'build'),
filename: 'bundle.js'
},
module: {
loaders: [
{
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['es2015','react']
}
},
]
}
};

- 創(chuàng)建入口文件app.js放置于app的文件夾內(nèi),希望 webpack 將它打包輸出為 build/ 目錄下的 bundle.js鸭轮。創(chuàng)建build文件夾臣淤,內(nèi)部創(chuàng)建index.html文件,其中 script 引入了 bundle.js窃爷。
- 運(yùn)行npm run build 和npm run start即可開啟服務(wù)器邑蒋,訪問http://localhost:8080/build/index.html即可
- 開發(fā)一個(gè)項(xiàng)目,首先構(gòu)思好樹形結(jié)構(gòu)按厘,分別構(gòu)建對(duì)應(yīng)js文件医吊,并且將總框架引入進(jìn)app.js
- 對(duì)于圖片和文件的引入,需要安裝相應(yīng)的loader:
`npm install url-loader file-loader --save-dev`
配置 webpack.config.js:

loaders: [
{
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
query: {
presets: ['es2015','react']
}
},
{
test: /.(png|jpg|gif)$/,
loader: 'url-loader?limit=8192' // 這里的 limit=8192 表示用 base64 編碼 <= 8K 的圖像
}
]```
然后像引入js文件一樣引入圖片刻剥,調(diào)用時(shí):<img src={引入的圖片名} />(注意此處img標(biāo)簽要自閉合)

  • 對(duì)于用方法引入的內(nèi)容遮咖,使用的時(shí)候用{this.xxx()}
  • 添加樣式滩字,也要用模塊化引入方法:
    npm install css-loader style-loader --save-dev
    (css-loader 處理 css 文件中的 url() 表達(dá)式.style-loader 將 css 代碼插入頁面中的 style 標(biāo)簽中.)
    并處理webpack配置文件
    { test: /\.css$/, loader: 'style-loader!css-loader' }
    引入則直接引入 : import ‘./xxx.css’
  • 對(duì)于父子組件間的通信, 可以使用屬性傳遞. 子組件可以使用 this.props 訪問到父組件傳入的屬性數(shù)據(jù).如父組件使用<NewsItem item={data} />傳入數(shù)據(jù)造虏,子組件就可以使用this.props.item訪問
  • 對(duì)于地址的處理需要引入U(xiǎn)RL:import URL from 'url'; URL.parse()將一個(gè)URL字符串轉(zhuǎn)換成對(duì)象并返回,
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末麦箍,一起剝皮案震驚了整個(gè)濱河市漓藕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挟裂,老刑警劉巖享钞,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡栗竖,警方通過查閱死者的電腦和手機(jī)暑脆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狐肢,“玉大人添吗,你說我怎么就攤上這事》菝” “怎么了碟联?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長僵腺。 經(jīng)常有香客問我鲤孵,道長,這世上最難降的妖魔是什么辰如? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任普监,我火速辦了婚禮,結(jié)果婚禮上琉兜,老公的妹妹穿的比我還像新娘鹰椒。我一直安慰自己,他們只是感情好呕童,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布漆际。 她就那樣靜靜地躺著,像睡著了一般夺饲。 火紅的嫁衣襯著肌膚如雪奸汇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天往声,我揣著相機(jī)與錄音擂找,去河邊找鬼。 笑死浩销,一個(gè)胖子當(dāng)著我的面吹牛贯涎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慢洋,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼塘雳,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了普筹?” 一聲冷哼從身側(cè)響起败明,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎太防,沒想到半個(gè)月后妻顶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年讳嘱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幔嗦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沥潭,死狀恐怖崭添,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情叛氨,我是刑警寧澤呼渣,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站寞埠,受9級(jí)特大地震影響屁置,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜仁连,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一蓝角、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饭冬,春花似錦使鹅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至炊苫,卻和暖如春裁厅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侨艾。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國打工执虹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唠梨。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓袋励,卻偏偏與公主長得像,于是被迫代替她去往敵國和親当叭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茬故,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容