1.react概念及基礎(chǔ)語法

React 特點(diǎn)

1.聲明式設(shè)計(jì) ?React采用聲明方式囤捻,可以輕松描述應(yīng)用鬓梅。
2.高效 ?React通過對DOM的模擬(虛擬DOM),最大限度地減少與DOM的交互肢专。
3.靈活 ?React可以與已知的庫或框架很好地配合本姥。
4.JSX ? JSX 是 JavaScript 語法的擴(kuò)展肩袍。React 開發(fā)不一定使用 JSX ,但我們建議使用它婚惫。(對比模板引擎)
5.組件 ? 通過 React 構(gòu)建組件氛赐,使得代碼更加容易得到復(fù)用,能夠很好的應(yīng)用在大項(xiàng)目的開發(fā)中辰妙。
6.單向響應(yīng)的數(shù)據(jù)流 ? React 實(shí)現(xiàn)了單向響應(yīng)的數(shù)據(jù)流鹰祸,從而減少了重復(fù)代碼,這也是它為什么比傳統(tǒng)數(shù)據(jù)綁定更簡單

一且皆為組件

函數(shù)化編程(Functional Programming)
它屬于”結(jié)構(gòu)化編程“的一種密浑,主要思想是把運(yùn)算過程盡量寫成一系列嵌套的函數(shù)調(diào)用
1.純函數(shù)(html) 輸入一定輸出也一定(只要不會改變原數(shù)組原對象就是純函數(shù))
2.柯理化函數(shù)(js)原來能多個參數(shù)蛙婴,要求變成一個參數(shù)

function sum(a){
   return function(b){
      return function(c){
          return a+b+c
      }  
   }
}
sum(2)(3)(4)  9
高級寫法
var fn = a=>b=>c+>a+b+c
fn(2)(3)(4)  //9

好處:
1.代碼簡潔,開發(fā)快速
2.接近自然語言尔破,易于理解
3.更方便的代碼管理
4.易于“并發(fā)編程”
5.代碼的熱升級

2.基礎(chǔ)

main.js
//引入react   可以在當(dāng)前JS中使用JSX語法
import React from "react"
//操作DOM
import ReactDOM  from  "react-dom"

ReactDOM.render(
    h1, //組件1
    document.getElementById("app"),  //2
    ()=>{   //3
        console.log("掛載成功")
    }
)
index.html中街图,需要一個大div   <div id="app"></div>
參數(shù):
1.需要渲染的DOM節(jié)點(diǎn)或者組件,如果渲染的是標(biāo)簽則只需要寫標(biāo)簽名(如:h1)即可浇衬,如果是組件則需要按照標(biāo)簽的形式輸寫(如:<App/>)
2.需要將渲染的這個節(jié)點(diǎn)掛載在哪里
3.回調(diào)

渲染內(nèi)容用{}

如:
相當(dāng)于innerText
let message = "111";
let dom = <h2>{message}---{3>2?'大于':'小于'}----{1+1}</h2>; //輸出:111--大于--2

相當(dāng)于innerHtml
let h2 = <h2>React</h2>
let dom = <div>{h2}</div>  //輸出<h2>React</h2>

判斷

相當(dāng)于if
let flag = true;
let dom = <div>{flag?<h2>111</h2>:''}</div>  //輸出111

相當(dāng)于if-else   只能用三目來判斷
let n = 10;
let dom = <div>{n==1? <p>111</p>:n==2? <p>222</p>:<p>333</p>}</div>

相當(dāng)于show顯示隱藏
let flag = false;
let dom = <div><h2 style={{display:flag?"block":'none'}}>1902</h2></div>

綁定數(shù)據(jù)

相當(dāng)于bind
let title="一個圖片";
let style = {
    width:"300px",
    height:"300px",
    background:'red'
}
let myclass = "box1 box2 box3"
let dom = <div title={title} style={style} className={myclass}>
    <label htmlFor="">
        111
    </label>
</div>

jsx語法中class需要改寫成className for需要改寫成htmlFor

創(chuàng)建組件

1.通過class來創(chuàng)建一個組件
語法:class 組件名稱 extends React.Component{}
 class App extends React.Component{
    render(){
        return(
             <div></div>
        )
    }
}
export default App   //導(dǎo)出APP

render: 是一個生命周期  用來渲染JSX DOM節(jié)點(diǎn)(虛擬DOM的渲染)
    語法:
        render(){
            return <div></div>
        }
注意:必須要return出去一個節(jié)點(diǎn) (只能返回一個節(jié)點(diǎn)類似與vue template里面只能有一個子元素)
如果需要返回多個元素的時(shí)候,只有一個根節(jié)點(diǎn)

簡寫,解構(gòu)方式
import React,{Component} from "react"
export default class App extends Component{
    render(){
        return <div></div>
    }
}

React.Component: 是所有組件的父類
組件內(nèi)部必須包含返回一個生命周期render餐济,不寫會報(bào)錯

遍歷

例:
//需要用括號
第一種方法 
{
       arr.map((item,index) =>{
            return <p key={index}>{item}</p>
        })
}
第二種方法 
{
    arr.map( (item,index) =>(<p key={index}>{item}</p>))
}
var fn = () =>{} 塊級作用域不會自動返回 需要寫return
var fn = () =>() 加框號返回整體  不需要寫return
var fn = () =>({}) 加框號返回對象  不需要寫return
組件中生命周期constrcutor中必須寫super
constrcutor(){
      super()
      this.state ={
            message= "1902"
      }
}

this.state 
表示:當(dāng)前組件所需要的一些狀態(tài)
語法:
<h2>{this.state.message}</h2>   //1902

事件綁定 如:on

handleClick   //自定義函數(shù)
bind(this) //表示指向當(dāng)前組件
<button  onClick={this.handleClick.bind(this)}></button>
handleClick(){
     this.state.message = "1903"
}
因?yàn)槭菃蜗驍?shù)據(jù)流耘擂,所以數(shù)據(jù)不會改變
想要改變數(shù)據(jù)要用  this.setState
handleClick(){
     this.setState({
          massage:1903
     })
}

數(shù)據(jù)修改 this.setState

1.react中如何修改this.state中的數(shù)據(jù)
2.this.setState是同步的還是異步的
-------異步的
3.this.setState的第二個參數(shù)的作用
4.this.setState為什么是異步的

語法
this.setState({
  key:val
},()=>{})
key:需要改變狀態(tài)的屬性
val:需要改變成的值

第二種方法
this.setState(()=>({
    message:val
}),()=>{})  

this.setState的第二個參數(shù)( (中有state)=>{} )的作用:
1、查看數(shù)據(jù)是否修改成功
2絮姆、獲取數(shù)據(jù)更新后的DOM結(jié)構(gòu)
(中有state)=>{}  寫上state可以對數(shù)據(jù)進(jìn)行檢測

只要this.setState被調(diào)用那么render函數(shù)就會被執(zhí)行
render 執(zhí)行說明DOM重新加載一次

this.state 這個函數(shù)只能它之內(nèi)修改醉冤,之后不能修改,想要修改
強(qiáng)制更新數(shù)據(jù)
this.forceUpdate(); //底層原理手動調(diào)用render函數(shù)

雙數(shù)據(jù)綁定----多用在表單

重復(fù)的東西可以做解構(gòu)
如: let {message}  = this.state
<input type="text" value={message} onChange = { this.handleChange.bind(this)}/>   不能傳參
<p>{message}</p>

value和onChange一起使用篙悯,單個會警告

React中value 與 defaultValue區(qū)別
1蚁阳、value屬于html的屬性  value會使輸入框變成一個受控組件
2、defaultValue屬于DOM的屬性  defaultValue會使輸入框變成一個非受控組件
受控組件--表示不能寫入
非受控組件---表示能寫入

性能優(yōu)化
     事件收寫的方式 
     1鸽照、this.函數(shù)名稱.bind(this)   
     2螺捐、this.函數(shù)名稱          性能最好
     3、onClick = {()=>{ }}   回調(diào)整不推薦
     this.handleChange = this.handleChange.bind(this)
     handleChange(e){
            var val = e.target.value;    
            this.setState({
                message:val
            })
      }

表單
export default  class App extends Component{
    constructor(){
        super();
        //存放當(dāng)前組件所需要的一些狀態(tài)
        this.state = {
            message:"1902",
            radioVal:"男",
            checkBoxVal:[],
            selectedVal:"1902"
        }

        this.handleChange = this.handleChange.bind(this)
        this.handleRadio = this.handleRadio.bind(this)
        this.handleCheckBox = this.handleCheckBox.bind(this)
        this.handleSelected = this.handleSelected.bind(this)
    }
    render(){
        let {message,radioVal,checkBoxVal,selectedVal} = this.state;
        return(
            <div>
                {/*<input type="text" value={message} onChange = {this.handleChange.bind(this)}/>*/}
                <input type="text" value={message} onChange = { this.handleChange}/>
                {/*<input type="text" value={message} onChange = { ()=>{*/}
                    {/*this.setState({*/}
                        {/*message:123*/}
                    {/*})*/}
                {/*}}/>*/}
                <p>{message}</p>

                <hr/>

                <label>
                  男  <input type="radio" value="男" checked={radioVal == '男'} onChange={ this.handleRadio}/>
                </label>
                <label>
                    女 <input type="radio" value="女" checked={radioVal == '女'} onChange={ this.handleRadio}/>
                </label>
                <p>您選擇的性別是:{radioVal}</p>

                <hr/>

                <label>
                    抽煙  <input type="checkbox" value="抽煙"  onChange={ this.handleCheckBox}/>
                </label>
                <label>
                    喝酒  <input type="checkbox" value="喝酒"  onChange={ this.handleCheckBox}/>
                </label>
                <label>
                    燙頭  <input type="checkbox" value="燙頭"  onChange={ this.handleCheckBox}/>
                </label>
                <label>
                    大保健  <input type="checkbox" value="大保健"  onChange={ this.handleCheckBox}/>
                </label>
                <ul>
                    您的愛好有:
                    {
                        checkBoxVal.map((item,index)=>(
                            <li key={index}>{item}</li>
                        ))
                    }
                </ul>
                <hr/>
                <select value={selectedVal} onChange={this.handleSelected}>
                    <option value="1902">1902</option>
                    <option value="1903">1903</option>
                    <option value="1904">1904</option>
                    <option value="1905">1905</option>
                    <option value="1906">1906</option>
                </select>
                <p>您選擇的班級是:{selectedVal}</p>
            </div>
        )
    }
    handleChange(e){
        var val = e.target.value;

        this.setState({
            message:val
        })
    }
    handleRadio(e){
        var val = e.target.value;
        this.setState({
            radioVal:val
        })
    }
    handleCheckBox(e){
        let val = e.target.value;

        let arr = this.state.checkBoxVal;
        //判斷數(shù)據(jù)是否在數(shù)組中存在
        let flag = arr.includes(val);
        if(flag){
            let index = arr.indexOf(val);
            arr.splice(index,1);
        }else{
            arr.push(val);
        }

        this.setState({
            checkBoxVal:arr
        })
    }
    handleSelected(e){
        let val = e.target.value;
        this.setState({
            selectedVal:val
        })
    }


}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矮燎,一起剝皮案震驚了整個濱河市定血,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诞外,老刑警劉巖澜沟,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浅乔,居然都是意外死亡倔喂,警方通過查閱死者的電腦和手機(jī)铝条,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門靖苇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人班缰,你說我怎么就攤上這事贤壁。” “怎么了埠忘?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵脾拆,是天一觀的道長。 經(jīng)常有香客問我莹妒,道長名船,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任旨怠,我火速辦了婚禮渠驼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鉴腻。我一直安慰自己迷扇,他們只是感情好百揭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜓席,像睡著了一般器一。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上厨内,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天祈秕,我揣著相機(jī)與錄音,去河邊找鬼雏胃。 笑死踢步,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丑掺。 我是一名探鬼主播获印,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼街州!你這毒婦竟也來了兼丰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤唆缴,失蹤者是張志新(化名)和其女友劉穎鳍征,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體面徽,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡艳丛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了趟紊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氮双。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖霎匈,靈堂內(nèi)的尸體忽然破棺而出戴差,到底是詐尸還是另有隱情,我是刑警寧澤铛嘱,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布暖释,位于F島的核電站,受9級特大地震影響墨吓,放射性物質(zhì)發(fā)生泄漏球匕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一帖烘、第九天 我趴在偏房一處隱蔽的房頂上張望亮曹。 院中可真熱鬧,春花似錦、人聲如沸乾忱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窄瘟。三九已至衷佃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹄葱,已是汗流浹背氏义。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留图云,地道東北人惯悠。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像竣况,于是被迫代替她去往敵國和親克婶。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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

  • 作為一個合格的開發(fā)者丹泉,不要只滿足于編寫了可以運(yùn)行的代碼情萤。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個周閱讀 8,452評論 1 33
  • 40摹恨、React 什么是React筋岛?React 是一個用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,022評論 0 1
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記晒哄,個人覺得該教程講解深入淺出睁宰,比目前大...
    leonaxiong閱讀 2,842評論 1 18
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個一級標(biāo)題插入到指...
    ryanho84閱讀 6,243評論 0 9
  • React簡介 (1)簡介 React 起源于 Facebook 的內(nèi)部項(xiàng)目寝凌,因?yàn)樵摴緦κ袌錾纤?JavaSc...
    魚魚吃貓貓閱讀 1,634評論 1 6