npm install creat-react-app -g
html
這裏直接安裝react的一個腳手架,裏面包含了要用到的許多東西,幫助快速入門reactreact
create-react-app my-app
cd my-app
npm start
用腳手架建立一個新的單頁應用,進到項目裏面後start
跑起來git
首先在頭部引入Component
組件,而後經過class
方式繼承Component
,最後將組件導出,便可成爲單獨組件使用。須要注意的地方就是組件的首字母必定要大寫github
//引入Component import {Component} from 'react'; //首字母大寫! class MyComponent extends Component{ consturtion(props){ super(props); this.state={ isShow:true } } /*react生命週期函數*/ componentWillMount() {} componentDidMount() {} componentWillReceiveProps() {} shouldComponentUpdate() {} componentWillUpdate() {} componentDidUpdate() {} componentWillUnmount() {} //經過render函數能夠將JSX語法渲染成真實dom render() { return ( <div> <h1>我是組件</h1> <p>{this.props.test}</p> <button onClick={()=>{ this.setState({ isShow:!this.state.isShow, }) }}>點我</button> <p>{this.state.isShow}</p> </div> ) } } //首字母大寫! class Parent extends Component{ return <MyComponent test="我是props" /> } export default Parent;
確實說白了就是html標籤寫到js中去,而後經過babel轉譯成react虛擬DOM對象,而後再渲染。
上例中算法
render() { return ( <div>我是組件,{this.props.test}</div> ) }
其實用的就是JSX語法,那麼在標籤內能夠嵌套js語句。想要嵌套js語句的時候須要用{}
包起來。npm
關於這一點,要詳細提及來還挺長的。考慮到是快速入門,因而乎咱們就記住一點,當修改值須要react從新渲染的時候,react的機制是不會讓他所有從新渲染的,它只會把你修改值所在的dom從新更新。這也是爲何react性能快的一大緣由。這個選擇渲染dom的算法叫作diff算法,若是要學習react就不能把這個給忘記。在往後須要好好把這方面的知識補全。這裏還要補充的就是,react把JSX語法先轉成react對象,而後經過內部建立節點插入到dom當中。仍是考慮到快速,因此該節篇幅就不繼續展開了,這些知識往後須要好好補全。redux
props若是接觸過Vue的話,應該會很好理解這個概念。沒接觸過也沒關係,由於是比較容易接受的。咱們這麼理解,其實就是父組件傳給子組件的一些東西,能夠是基本數據類型,也能夠是引用數據類型,也就是說啥均可以傳。子組件能夠經過this.props
這個對象來獲取父組件傳下來的值性能優化
仍是看回上面的例子babel
class MyComponent extends Component{ render() { //這裏能夠拿到 return ( <div> <h1>我是組件</h1> <p>{this.props.test}</p> <button onClick={()=>{ this.setState({ isShow:!this.state.isShow, }) }}>點我</button> <p>{this.state.isShow}</p> </div> ) } } class Parent extends Component{ render() { //經過父組件傳進去 return <MyComponent test="我是props" /> } }
組件state是狀態,這裏存放的就是該組件的一些會改變的變量,就是狀態。好比判斷組件屬性變化,獲取表單值等。修改state會引發react從新渲染,也就是更新狀態會引發組件刷新。咱們能夠經過setState()
這個函數來設置state的值。不過要注意的是setState()
這個函數是異步函數。下面仍是看上面的例子react-router
class MyComponent extends Component{ consturtion(props){ super(props); this.state={ isShow:true } } render() { return ( <div> <h1>我是組件</h1> <p>{this.props.test}</p> <button onClick={()=>{ //點擊後可修改state值 this.setState({ isShow:!this.state.isShow, }) }}>點我</button> <p>{this.state.isShow}</p> </div> ) } }
這個意思實際上就是在一個組件裏面能夠用別的組件的意思。所以你能夠把組件劃分得比較細緻,以便更多的複用。
class Parent extends Component{ render() { //使用了MyComponent組件 return <MyComponent test="我是props" /> } }
在這裏就說一下組件的生命週期函數吧
componentWillMount() {}
組件掛載前componentDidMount() {}
組件掛載完執行componentWillReceiveProps() {}
組件更新數據時執行,props
、state
shouldComponentUpdate() {}
組件須要更新時執行componentWillUpdate() {}
組件更新前執行componentDidUpdate() {}
組件更新後執行componentWillUnmount() {}
組件銷燬前執行下面一張圖解釋生命週期
固然想要暫時略過也不是不可,但往後須要瞭解。
constructor能夠初始化state
constructor(props) { super(props); this.state = { color: '#333' }; }
不要直接把props附給state!此模式僅用於你但願故意忽略屬性更新 。
constructor(props) { super(props); // Don't do this! this.state = { color: props.color }; }
能夠用做異步發請求,該生命週期在組件更新時候給多了一次機會操做dom
componentDidUpdate(prevProps) { // Typical usage (don't forget to compare props): if (this.props.userID !== prevProps.userID) { this.fetchData(this.props.userID); } }
爲了防止重複渲染,若有setstate必須包括在條件中!
實際上做爲性能優化的一種方案,可是不能依賴於它來阻止渲染,由於這樣會引發bug
不推薦作深相等檢測,或使用JSON.stringify()在shouldComponentUpdate()中。這是很是無效率的會傷害性能。
注意,返回false不能阻止子組件當他們的狀態改變時從新渲染。
組件實例化後和接受新屬性時將會調用getDerivedStateFromProps。它應該返回一個對象來更新狀態,或者返回null來代表新屬性不須要更新任何狀態。
getSnapshotBeforeUpdate()在最新的渲染輸出提交給DOM前將會當即調用。
它讓你的組件能在當前的值可能要改變前得到它們。這一輩子命週期返回的任何值將會 做爲參數被傳遞給componentDidUpdate()。
學完react,咱們還須要知道react-router、redux等react全家桶。還在這推薦一個開源框架DVa.js。固然,這是融合的比較好的,若是學有餘力不妨去了解了解
附上一張學習路線圖,供你們學習參考
圖片來源:https://github.com/adam-golab/react-developer-roadmap
入門react並不難,可是要用得精通卻不容易。本文並不期望能讓你懂多少react,可是若是能帶你入門,那即是他它的成功。但願每一個人都能成爲本身想要的樣子。
最後,成功不在一朝一夕,咱們都須要努力
原創文章,轉載需聯繫