筆記:05:React

目錄

1、script钢颂。
2钞它、jsx語法
3、綁定事件
4、函數(shù)組件
5遭垛、解析html
6尼桶、遍歷
7、判斷
8锯仪、slot插值
9泵督、jsx編譯
10、創(chuàng)建組件---createClass
11庶喜、創(chuàng)建組件---component(es6)
12小腊、組件通信
13、表單內(nèi)容
14久窟、性能優(yōu)化
15秩冈、路由
16、路由傳參
17斥扛、生命周期
18入问、key的作用
19、狀態(tài)(state)和屬性(props)之間有何不同
20犹赖、虛擬dom
21队他、為什么說虛擬dom會提高性能?
22峻村、diff算法
23麸折、dva:js和jsx的區(qū)別
24、dva:路由跳轉(zhuǎn)
25粘昨、刷新攔截

正文

1垢啼、script。默認type='text/javascript'
  • <script type='text/babel'>张肾,頁面在加載時會被browser.js編譯成真正的js插入頁面中芭析。
2、jsx語法
  • jsx是js和html混合的寫法吞瞪,遇到<>以html形式進行解析馁启,遇到{}以js形式進行解析。
3芍秆、綁定事件
  • 不傳參:例:<div onClick={f1}></div>
  • 傳參:例:<div onClick={(e)=>{f2(100,e)}}></div>
4惯疙、函數(shù)組件(將模板return出去)

普通函數(shù)調(diào)用:例:{Ipt()}
組件形式調(diào)用:例:<Ipt a='10' b={20}></Ipt>。參數(shù)用props接收妖啥。定義時首字母大寫霉颠。

5、解析html

dangerouslySetInnerHTML(==v-html):例:

<div dangerouslySetInnerHTML={{__html:str_x}}></div>
6荆虱、遍歷
7蒿偎、判斷
8朽们、slot插值
  • 通過props.children獲得。
9诉位、jsx編譯
var x = <div id="box"> hello </div>
var x = React.createElement("div",{id:"box"},[React.createElement("em",{key:1},"hello"),React.createElement("span",{key:2},"span")])
10骑脱、創(chuàng)建組件---createClass
  • createClass:React.createClass({})
  • getInitialState:組件內(nèi)部的狀態(tài),可相應的不从,是一個function返回對象惜姐。例:
getInitialState(){
    return {
        num:0
    }
}
  • render:定義模板。this指向組件實例椿息。例:
render(){
    return(
        <div>
            <button onClick={()=>{this.increase(100)}}></button>
        </div>
    )
}
  • 方法歹袁。方法內(nèi)部本身為null,改變this指向后寝优,this指向組件實例条舔。例:
increase(a){
    this.setState({ // 修改狀態(tài);訪問狀態(tài):this.state.val
        num:this.state.num+a
    },()=>{ // 數(shù)據(jù)變化乏矾,DOM更新之后執(zhí)行函數(shù)孟抗,類似于Vue nextTick
        console.log(this.refs.txt.innerHTML) // 操作DOM
    })
}

因為setState是一個異步的過程,所以說執(zhí)行完setState之后不能立刻更改state里面的值钻心。如果需要對state數(shù)據(jù)更改監(jiān)聽凄硼,setState提供第二個參數(shù),就是用來監(jiān)聽state里面數(shù)據(jù)的更改捷沸,當數(shù)據(jù)更改完成摊沉,調(diào)用回調(diào)函數(shù)。

11痒给、創(chuàng)建組件---component(es6)

class App extends React.Component{}

  • constructor:定義自身的方法和屬性说墨。例:
constructor(props){
    super(props); // 繼承
    this.state={
        num:100
    }
}
12、組件通信 原文鏈接
  • 父--->子:父組件通過向子組件傳遞props苍柏,子組件得到props后進行相應的處理尼斧。
  • 子--->父:利用回調(diào)函數(shù),可以實現(xiàn)子組件向父組件通信:父組件將一個函數(shù)作為props傳遞給子組件试吁,子組件調(diào)用該回調(diào)函數(shù)棺棵,便可以向父組件通信。
  • 兄弟:react-redux 原文鏈接 redux是react中常用的一個進行集中狀態(tài)管理的工具熄捍,當一個狀態(tài)被多個狀態(tài)所訪問時律秃,傳統(tǒng)組件通信過于繁瑣,可以將狀態(tài)放入redux治唤。
13、表單內(nèi)容
<input type="text" value={this.state.val} onChange={(e)=>{this.setState({val:e.target.value})}}/>
14糙申、性能優(yōu)化
  • 組件內(nèi)部調(diào)用setState宾添,當前組件及子組件都會重新渲染船惨,生命周期并不會重復執(zhí)行。
  • shouldComponentUpdate:決定組件是否重新渲染缕陕,return true 渲染粱锐。可以避免不必要的dom操作扛邑。
  • PureComponent:class Index extends React.PureComponent{}
  • 使用路由懶加載怜浅。
  • 使用key來幫助React識別列表中所有子組件的最小變化。
15蔬崩、路由

路由暴露對象是ReactRouterDom恶座。例:

let { HashRouter, Route, Link, Redirect, Switch, withRouter} = ReactRouterDom
  • Route包裹路由組件。例:<Route path='/' component={Index}/>
  • Link類似于vue中 router-link沥阳。例:<Link to='/'> 首頁 </Link>
  • NavLink:是Link的一個特定版本跨琳,會在匹配上當前的url的時候,給已經(jīng)渲染的元素添加 樣式 參數(shù)桐罕。原文鏈接
  • BrowserRouter(路徑不帶#)脉让、HashRouter(路徑帶#)限定路由使用區(qū)域 原文鏈接
  • withRouter:對普通組件進行包裹功炮,將路由相關(guān)對象注入到組件溅潜。只有路由組件上props內(nèi)部包含路由相關(guān)信息及方法。需要使用withRouter將路由對象注入 非路由 組件的props上薪伏。
  • Redirect:路由重定向滚澜。
  • Switch:確保包含的Route組件只匹配一個。
16毅该、路由傳參 原文鏈接
  • 方式一:params(刷新頁面數(shù)據(jù)不會丟失)
    路由配置:例:<Route path='/detail/:id' component={Detail}></Route>
    路由跳轉(zhuǎn):例:this.props.history.push('/detail/10')博秫;<Link to='/detail/10'></Link>
    注意:js跳轉(zhuǎn)時,需要使用withRouter眶掌。例:export default withRouter(connect(getProps,getDis)(List)) 父組件
    路由頁面接收參數(shù):例:this.props.history.match.params.id
    當前路由:例:localhost:3000/detail/10
  • 方式二:state(刷新頁面數(shù)據(jù)不會丟失)
    路由配置:例:<Route path='detail' component={Detail}></Route>
    路由跳轉(zhuǎn):例:this.props.history.push({pathname:'/detail',state:{id:10}})挡育;<Link to={{pathname:'detail',state:{id:10}}}></Link>
    注意:js跳轉(zhuǎn)時,需要使用withRouter朴爬。例:export default withRouter(connect(getProps,getDis)(List)) 父組件
    路由頁面接收參數(shù):例:this.props.location.state.id
    當前路由:例:localhost:3000/detail
  • 方式三:query(刷新頁面數(shù)據(jù)丟失)
    路由配置:例:<Route path='detail' component={Detail}></Route>
    路由跳轉(zhuǎn):例:this.props.history.push({pathname:'/detail',query:{id:10}})即寒;<Link to={{pathname:'detail',query:{id:10}}}></Link>
    注意:js跳轉(zhuǎn)時,需要使用withRouter召噩。例:export default withRouter(connect(getProps,getDis)(List)) 父組件
    路由頁面接收參數(shù):例:this.props.location.query.id
    當前路由:例:localhost:3000/detail
17母赵、生命周期 原文鏈接

聲明周期里的this指向組件實例。

  • 1具滴、getDefaultProps
    這個方法是用來設置組件默認的props凹嘲,組件生命周期只會調(diào)用一次。只適用于React.createClass直接創(chuàng)建組件构韵。
  • 2周蹭、getInitialState
    設置state初始值趋艘,可以訪問到this.props。只適用于React.createClass凶朗。
  • 3瓷胧、componentWillMount
    這個方法在組件首次渲染之前調(diào)用,這個是在render方法調(diào)用之前可以修改state的最后一次機會棚愤。這個很少用到搓萧。
  • 4、render
    JSX通過這里宛畦,可以解析成對應的虛擬DOM瘸洛,渲染成最終結(jié)果。
  • 5刃永、componentDidMount
    這個方法在首次真實的DOM渲染后調(diào)用(僅此一次)货矮。當我們需要訪問真實的DOM時,在這個方法中訪問斯够。
  • 6囚玫、componentWillReceiveProps
    每當我們通過父組件更新子組件props時(這個也是唯一途徑),這個方法被調(diào)用读规。
  • 7抓督、shouldComponentUpdate
    字面意思,是否應該更新組件束亏,默認返回 true铃在。當返回 false 時,后期函數(shù)就不會調(diào)用碍遍,組件不會在次渲染定铜。
  • 8、componentWillUpdate
    組件將會更新怕敬,props和state改變后必調(diào)用揣炕。
  • 9、render
    跟實例化的render一樣东跪。
  • 10畸陡、componentDidUpdate
    這個方法在更新真實的DOM成功后調(diào)用,當我們需要訪問真實的DOM時虽填,這個方法也經(jīng)常用到丁恭。
  • 11、componentWillUnmount
    每當組件調(diào)用斋日,這個組件就必須從DOM中銷毀牲览,此時該方法就會被調(diào)用。當我們在組件中使用了setInterval恶守,那我們就需要在這個方法中調(diào)用clearInterval竭恬。如果手動使用了addEventListener綁定事件跛蛋,也需要解綁事件。
18痊硕、key的作用
  • Keys 是 React 用于追蹤哪些列表中元素被修改、被添加或者被移除的輔助標識押框。
19岔绸、狀態(tài)(state)和屬性(props)之間有何不同
  • state:是一種數(shù)據(jù)結(jié)構(gòu),用于組件掛載時所需數(shù)據(jù)的默認值橡伞。state可能會隨著時間的推移而發(fā)生突變盒揉,但多數(shù)時候,是作為用于事件行為的結(jié)果兑徘。
  • props(properties):是組件的配置刚盈。props由父組件傳遞給子組件,并且就子組件而言挂脑,props是不可變得藕漱。組件不能改變自身的props,但是可以把其子組件的props放在一起(統(tǒng)一管理)崭闲。props也不僅僅是數(shù)據(jù)肋联,回調(diào)函數(shù)也可以通過props傳遞。
20刁俭、虛擬dom
  • 本質(zhì):用js對象橄仍,來模擬DOM元素的嵌套關(guān)系;
  • 目的:就是為了實現(xiàn)頁面元素的高效更新牍戚。
21侮繁、為什么說虛擬dom會提高性能?
  • 說Virtual(虛擬) DOM高效的一個理由就是它不會直接操作原生的DOM節(jié)點如孝,因為這個很消耗性能宪哩。當組件狀態(tài)變化時它會通過某些diff算法去計算出本次數(shù)據(jù)更新真實的視圖變化,然后只改變“需要改變”的DOM節(jié)點暑竟。
  • 虛擬 dom 相當于在 js 和真實 dom 中間加了一個緩存斋射,利用 dom diff 算法避免了沒有必要的 dom 操作,從而提高性能但荤。
22罗岖、diff算法
  • tree diff:新舊兩棵DOM樹,逐層對比的過程腹躁,就是Tree Diff桑包;當整棵DOM逐層對比完畢,則所有需要按需更新的元素纺非,必然能夠找到哑了。
  • component diff:在進行Tree Diff的時候赘方,每一層中,組件級別的對比弱左,叫做Component Diff窄陡。
    如果對比前后,組件類型相同拆火,則暫時認為組件不需要被更新跳夭。
    如果對比前后,組件類型不同们镜,則需要移除舊組件币叹。創(chuàng)建新組建,并追加到頁面上模狭。
  • element diff:在進行組件對比的時候颈抚,如果兩個組件類型相同,則需要進行元素級別的對比嚼鹉,這叫做Element Diff贩汉。
23、dva:js和jsx的區(qū)別
  • JS:即JavaScript反砌,一種直譯式腳本語言雾鬼。
  • JSX:即JavaScript XML——一種在React組建內(nèi)部構(gòu)建標簽的類XML語法。(增強React程序組件的可讀性)宴树。
  • 區(qū)別:瀏覽器只能識別普通的js策菜,普通的css,并不能識別scss酒贬,或者jsx(scss是css的拓展又憨,jsx可以看做是js的拓展),所以webpack的作用是把scss轉(zhuǎn)換為css锭吨,把jsx轉(zhuǎn)換為瀏覽器可以識別的js蠢莺,然后瀏覽器才能正常使用。
    JSX語法零如,像是在Javascript代碼里直接寫XML的語法躏将,實質(zhì)上這只是一個語法糖,每一個XML標簽都會被JSX轉(zhuǎn)換工具轉(zhuǎn)換成純Javascript代碼考蕾,React 官方推薦使用JSX祸憋, 當然你想直接使用純Javascript代碼寫也是可以的,只是使用JSX肖卧,組件的結(jié)構(gòu)和組件之間的關(guān)系看上去更加清晰蚯窥。
24、dva:路由跳轉(zhuǎn)
  • 1、'dva/router'下引入Link拦赠;
    布局中使用<Link to='/'>去首頁</Link>
  • 2巍沙、this.props.history.push('/') // 注:需要將父級頁面的history傳遞過來。
  • 3荷鼠、組件文件引入:import {withRouter} from 'dva/router'
    export default withRouter(ListBtn)
  • 4句携、組件文件引入:import {routerRedux} from 'dva/router'
    this.props.dispatch(routerRedux.push('/'))
25、刷新攔截(參考文件
  componentWillMount () {
    // 攔截判斷是否離開當前頁面
    window.addEventListener('beforeunload', this.beforeunload);
  }
  componentWillUnmount () {
    // 銷毀攔截判斷是否離開當前頁面
    window.removeEventListener('beforeunload', this.beforeunload);
  }
  beforeunload (e) {
    let confirmationMessage = '你確定離開此頁面嗎?';
    (e || window.event).returnValue = confirmationMessage;
    return confirmationMessage;
  }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末允乐,一起剝皮案震驚了整個濱河市务甥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喳篇,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件态辛,死亡現(xiàn)場離奇詭異麸澜,居然都是意外死亡,警方通過查閱死者的電腦和手機奏黑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門炊邦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人熟史,你說我怎么就攤上這事馁害。” “怎么了蹂匹?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵碘菜,是天一觀的道長。 經(jīng)常有香客問我限寞,道長忍啸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任履植,我火速辦了婚禮计雌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玫霎。我一直安慰自己凿滤,他們只是感情好,可當我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布庶近。 她就那樣靜靜地躺著翁脆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拦盹。 梳的紋絲不亂的頭發(fā)上鹃祖,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音,去河邊找鬼恬口。 笑死校读,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的祖能。 我是一名探鬼主播歉秫,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼养铸!你這毒婦竟也來了雁芙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钞螟,失蹤者是張志新(化名)和其女友劉穎兔甘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳞滨,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡洞焙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了拯啦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澡匪。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖褒链,靈堂內(nèi)的尸體忽然破棺而出唁情,到底是詐尸還是另有隱情,我是刑警寧澤甫匹,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布甸鸟,位于F島的核電站,受9級特大地震影響赛惩,放射性物質(zhì)發(fā)生泄漏哀墓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一喷兼、第九天 我趴在偏房一處隱蔽的房頂上張望篮绰。 院中可真熱鬧,春花似錦季惯、人聲如沸吠各。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贾漏。三九已至,卻和暖如春藕筋,著一層夾襖步出監(jiān)牢的瞬間纵散,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留伍掀,地道東北人掰茶。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蜜笤,于是被迫代替她去往敵國和親濒蒋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,500評論 2 359

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