React不是一個框架,是一個用於構建用戶界面的JS庫,實現單頁面應用。React用於在前端構建用戶界面(UI)。React是MVC應用程序的視圖層(模型視圖控制器)。html
多頁面應用:頁面跳轉時跳轉的都是完整的html頁面
單頁面應用:只有一個html頁面,全部內容都在這個頁面中展現,經過'路由'來加載不一樣內容。所有是經過js來控制顯示的。優勢:用戶體驗比較好,加載比較流暢。缺點:不利於seo(網站優化,影響搜索排名),解決辦法ssr(服務端渲染)。
先決條件 :全局安裝了Node.js和npm。 npm i -g yarn(yarn下載速度比npm快) 方法1 :npx create-react-app my-app(項目初始化)
Create React App解讀 :該環境預先配置了構建React應用所需的一切。它將建立一個實時開發服務器,使用Webpack自動編譯React,JSX和ES6,自動前綴CSS文件,並使用ESLint測試和警告代碼中的錯誤。前端
node_modules : 項目依賴包 public : 靜態文件 (模板-index.html) src : 編寫前臺代碼文件夾 index.js : 入口文件 App.js : 入口文件中渲染的頁面 .test.js : 測試文件,通常不須要管 serviceWorker.js : PWA的配置文件 .gitignore文件 : git上傳時的忽略配置文件 package.json :記錄安裝信息 "scripts": { "start": "react-scripts start", //啓動開發階段服務器 "build": "react-scripts build", //打包 "test": "react-scripts test", //運行測試 "eject": "react-scripts eject" //顯示隱藏的配置 } 運行npm run eject時,提示這個命令是不可逆的, 運行後會多出config文件夾和scripts文件夾, config裏邊是webpack的配置;scripts裏邊是啓動命令的配置, 通常不執行這個命令
1.在js中能夠直接寫html HTML部分:直接寫html標籤 JS部分 : 寫在 { } 內 ·babel會把jsx轉成React.createElement() ·React.createElement()方法是建立react元素(虛擬DOM)的方法 ·ReactDom.render()的第一個參數,須要的就是react元素 2.JSX的特色 { }大括號中寫的是js表達式,【注】大括號中不能直接渲染對象,能渲染數組(不能有普通對象) 1. 類名 : className <div className='' ></div> <label htmlfor='' ></label> 2.添加行內樣式: <div id={uid} style={{color:'red',fontsize:'14px'}} ></div> 3. react元素時不可變的,若是須要更新頁面顯示,就須要建立新的react元素 4.JSX是一個表達式,能夠在map循環的代碼塊中使用JSX,將 JSX 賦值給變量, 把 JSX 看成參數傳入,以及從函數中返回 JSX。 在JSX當中,是不能使用if else 的,不過可使用三元運算表達式 .map(function(ele,index){ return 返回值 }) 數組的一個遍歷方法,ele是數組元素項,index是下標,return後是返回值 5. JSX屬性 1.使用引號來定義以字符串爲值的屬性 const element = <div tabIndex="0"></div>; 2.使用大括號來定義以 JavaScript 表達式爲值的屬性 const element = <img src={user.avatarUrl}></img>; 3.style樣式使用JSX,寫法以下: <div style={{ color:"red" ,fontSize:"30px"}}></div>
React DOM 會負責更新 DOM 來與 React 元素保持一致node
語法:ReactDom.render(element,parentNode) 說明:
1.參數1:element爲要顯示的元素。能夠是雙標籤形式的,也能夠是單標籤形式的,若是是單標籤必須有結束符號
2.參數2:parentNode爲元素要顯示在頁面的哪一個標籤中。 3.渲染方法通常一個項目中只有一個。其餘頁面經過組件引入或者路由訪問。 4.更新已渲染的元素:React 元素是不可變對象。一旦被建立,你就沒法更改它的子元素或者屬性。 react元素寫法: 1.直接使用jsx語法: `<div>{變量名}</div>` 2.使用React.createElement() 3.使用組件`<App/>`
建立方式有兩種:react
function App(props){ return (<div>{props.name}</div>) }
2. 類型式組件 :前期使用類組件,會學習類組件中的state,生命週期函數 類組件中想要獲取props須要用 this.props 來獲取
class App extends React.Component{ render(){ return ( <div></div> ) } }
【注意】無論函數式組件仍是類型式組件,必須先引入React,不然報錯;return返回的jsx只能有一個頂層標籤webpack
import React,{Component} from 'react' class Home extends React.Compoent{ return (<div></div>) }
說明: 1:組件名稱首字母要求大寫git
2:須要繼承React.Component這個類 3:必須有一個render函數,render必須return,return後寫的是jsx語法
export {Home} export default Home
import {Home} from 'path'---->Home名字是自定義 import Home from 'path'
<Home/> || <Home></Home>
把頁面中的某一塊UI拆分出去,作成一個組件,在使用的位置直接屢次調用組件便可es6
<Item data='data' arr={[1,2,3]} />
class Item extends Component{ console.log(this.props) // {data:'string',arr:[1,2,3,4]} }
arr/obj.map(function(item,index){ return item })
constructor(){ super(); this.state = { count : 1 } }
第二種:直接在組件中定義web
state = { count : 1 }
this.setState({ count : this.state.count + 1 })
方法2函數形式的 :
this.setState((state)=>{ return { count : state.count + 1 } })
this.setState({count : this.state.count + 1})ajax
this.setState({ },( )=>{ })
setState的函數形式 :參數state指的永遠是最新的數據,是上一次操做完state的結果npm
this.setState((state)=>{ return { count : state.count + 1 } })
生命週期函數也被稱爲鉤子函數,在組建運行過程當中在某些特定條件下自動執行的函數。重點:componentDidMount , componentDidUpdate , shouldComponentUpdate , componentWillUnmount
··· componentWillMount 組件即將渲染(可能會網絡請求,可是不建議)
··· componentDIdMount 組件渲染完成(網絡請求,全局事件綁定)
··· shouldComponentUpdate 是否容許組件更新(優化使用)
··· componentWillUpdate 組件即將更新(通常不作任何處理)
··· componentDidUpdate 組件更新完成(新的網絡請求)
··· compoentWiiReceiveProps 組件接收新的props(通常不作任何處理)
··· componentWillUnmount 組件即將卸載(把全局綁定的事件,網絡請求等有反作用的所有清除)
react中本身從新定義了事件系統,react綁定事件不須要獲取到DOM元素,而是把事件綁定定義再虛擬DOM上
語法:<div on事件名 = {函數}>《/div>事件名要求採用駝峯命名法
函數編寫形式:
1.直接定義一個箭頭函數 2.能夠定義函數 若是是類型式組件,須要使用this.clickme,clickme函數定義在類中 class App extends React.Component{ clickme() render(){ return <div onClick={this.clickme}></div> } } 3. this指向問題 在react中,自定義事件中this默認是指向undefined的 若是想讓this指向當前組件有如下幾種方法: 1.在constructor構造方法中經過bind綁定this 2.使用bind,改變this指向(能夠傳參) 3.使用箭頭函數(內存開銷最大) 若是當函數調用時沒有傳參,建議在constructor方法中綁定,若是函數調用時須要傳參,直接使用bind綁定更多一些
事件對象不須要傳遞,直接調用就行,在事件對象方法函數形參的最後一個位置
獲取座標信息 阻止默認事件 阻止冒泡 獲取事件觸發者
form標籤 <form action='http://xxx' method='get | post'></form>
ajax:不刷新頁面,實現局部刷新,form不多用
表單:收集用戶輸入信息
第一種 : 受控組件(表單數據的顯示和更改都是由react的state控制的,使react的state成爲'惟一數據源') 第二種 : 非受控組件(容許用戶獲取到原生DOM,本身來操做數據)
。。。reart--》es6函數擴展