React是當下前端生態圈流行的框架之一,與Vue和Angular並稱前端三架馬車。今天,我們就一起來學習下React,今天的主要內容有。
- 利用React腳手架create-react-app搭建項目
- 編寫一個React計數組件
利用React腳手架create-react-app搭建項目
這里筆者例舉兩種利用create-react-app搭建項目的方式
全局安裝
npm i -g create-react-app
create-react-app my-app
cd my-app && npm start
npx安裝
npx create-react-app my-app
cd my-app && npm start
這兩種方案各有各的好處,我們先說全局安裝吧。npm i -g create-react-app
只需要執行一次,后面你在任意目錄執行create-react-app project
就可以創建一個react項目的腳手架,這免去了開發者很多配置的工作。npx安裝需要的npm版本在5.2.0以上,它的原理大致是先去全局的node_modules下找找看有沒有這個包,沒有的話再去本地項目找找有沒有這個包,還是沒有就去遠程拉一個最新的下來。
這兩種筆者更傾向於使用第二種npx安裝的方式。這里我給出兩個理由,第一個,當下前端發展太快了,各種包庫更新迭代的太快,如果你全局安裝的話,用接地氣的話感覺就是有點跟不上時代(PS: 除非是去那種網絡不通的公司)。第二個,它有可能跟其他的全局包產生一個沖突,就以create-react-app
為例,如果你本地安裝了yarn的全局包,你將有機會看到yarnpkg add --exact react react-dom react-scripts --cwd has failed
的錯誤,大致應該是沒有用npm install
而是用yarn
導致的,這里刪掉全局的yarn
包可以解決這個問題。
編寫一個React計數組件
我們要實現這樣一個組件,點擊加號按鈕數字加1,點擊減號按鈕數字減1。
我們先定義一個文件ClickCounter.js
, 這里的命名規范講一下,類似於JAVA的導包com.ataola.utils
這種,用戶的這個行為是點擊,點擊是為了計數。當然啦用戶點擊它還可以搞些別的事情,比如說報名啊,回到頂部等等等等,所以把Click放在前面,Counter放在后面。
JSX語法
即Javascript的語法擴展。擴展了以后,你可以把一坨HTML代碼丟到Javascript里面來寫。形如樓下這樣。
render() {
return (
<div>
<button onClick={ this.Add }>Add</button>
<button onClick={ this.Reduce }>Reduce</button>
<div>Count: { this.state.count }</div>
</div>
)
}
在Render函數中,我們返回一段html代碼,寫着一個加一個減按鈕,然后顯示相應的包。
引入相應的組件包
import React, { Component } from 'react';
編寫相關類
class ClickCounter extends Component {
constructor(props) {
super(props);
this.state = { count: 0 };
this.Add = this.Add.bind(this);
this.Reduce = this.Reduce.bind(this);
}
Add() {
this.setState({ count: this.state.count + 1 });
}
Reduce() {
this.setState({ count: this.state.count - 1 })
}
render() {
return (
<div>
<button onClick={ this.Add }>Add</button>
<button onClick={ this.Reduce }>Reduce</button>
<div>Count: { this.state.count }</div>
</div>
)
}
}
暴露相應的類
export default ClickCounter;
在index.js中引入我們創建的類,並加入到渲染函數中
import ClickCounter from './ClickCounter';
ReactDOM.render(
<React.StrictMode>
<ClickCounter/>
</React.StrictMode>,
document.getElementById('root')
);
至此我們已經學會了搭建React項目,並能夠設計簡單的React組件。
問題思考
this.setState({ count: this.state.count + 1 });
這句我能不能修改成this.state.count++
?
這句話的意思翻譯過來就是,我能不能直接手動擋操作state里面的變量?答案肯定是能寫成那種形式,你能訪問到那個對象,你給它加加有問題嗎?但是從React設計理念上,這是非常暴力魯棒的做法,你就想嘛,難道這個setState
是放着讓你看噠,很顯然不是的。因為React在設計state時候是異步的,當你調用setState
的時候,它會被放入異步隊列中,所以它也不是馬上去改變state里面的數據。而你這個加加的寫法是同步的馬上去修改,假如說哈,你的加法是用加加這種寫法,然后你的減法是用setState()
這種,當你點擊加的時候React,它心態崩了呀,它也不知道你想干嘛,它想干的是異步的事情,而你要干的是同步的事情,它瘋了。。。。。
好在,現在的編譯器啊、或者配合ESLint智能,它會巧妙地提示你Do not mutate state directly. Use setState() react/no-direct-mutation-stateDo not mutate state directly. Use setState() react/no-direct-mutation-state
,讓你巧妙地避開這種違背框架設計理念的寫法。
思考一下,Vue里面可不可以,當然是可以的啦。
具體的參考下樓下地址:
React demo1: https://github.com/ataola/react-Inkjet/tree/master/code/demo-1
Vue demo1: https://github.com/ataola/vue-Graffiti/tree/master/code/demo1
參考文獻
《深入淺出React和Redux》 機械工業出版社 程墨 編著
本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。