// 寫(xiě)法一
export default class App extends React.Component {
tableHeader = () => {};
}
// 寫(xiě)法二
export default class App extends React.Component {
constructor(props) {
super(props);
this.tableHeader = this.tableHeader.bind(this);
}
tableHeader() {
};
}
// 寫(xiě)法三
export default class App extends React.Component {
tableHeader() {
};
}
我在看其他人的代碼時(shí),發(fā)現(xiàn)有上面這幾種方法,都有什么區(qū)別啊,我糾結(jié)了好幾天了.上網(wǎng)找了下,也沒(méi)看出所以然,如果想弄懂,該看哪些資料呢
上面的第二種寫(xiě)法我是不能接受,太繁瑣了.
我是否可以理解為,下面兩種下法是等價(jià)的呢.
我一般都是使用下面的第五種寫(xiě)法,但是有同事和我說(shuō)寫(xiě)法四會(huì)比較好,性能方面會(huì)好些,但是我理解的,這兩種寫(xiě)法效果是一樣的,不存在性能不同的問(wèn)題
// 寫(xiě)法四
class App extends React.Component {
constructor(props) {
super(props);
}
handleClick= ()=>{
}
render() {
return (
<button onClick={this.handleClick}>點(diǎn)擊</button>
);
}
}
// 寫(xiě)法五
export default class App extends React.Component {
handleClick() {
};
render(){
return (
<button onClick={()=> {this.handleClick();}}>點(diǎn)擊</button>
);
}
}
我說(shuō)下我喜歡第五種的原因,因?yàn)橛袝r(shí)候我會(huì)這樣寫(xiě),這樣寫(xiě)法比較簡(jiǎn)單,并且也可以達(dá)到函數(shù)復(fù)用.
抱歉,一個(gè)問(wèn)題修改了這么多次?
export default class App extends React.Component {
handleClick(type) {
console.log(`獲取${type}數(shù)據(jù)`);
};
render(){
return (
<div>
<button onClick={()=> {this.handleClick('header');}}>獲取頂部數(shù)據(jù)</button>
<button onClick={()=> {this.handleClick('footer');}}>獲取底部數(shù)據(jù)</button>
</div>
);
}
}
主要是函數(shù)內(nèi)this指向不同
第一種寫(xiě)法還不是js標(biāo)準(zhǔn),但是babel已經(jīng)支持了。相當(dāng)于讓tableHeader的值為一個(gè)箭頭函數(shù),而箭頭函數(shù)的特性我們都知道:它內(nèi)部沒(méi)有this,它會(huì)使用定義時(shí)的this,這里this就會(huì)指向這個(gè)類(lèi)的實(shí)例。
第二種寫(xiě)法它的目的和第一種是一樣的,讓函數(shù)內(nèi)部的this指向這個(gè)類(lèi)的實(shí)例,它是用bind實(shí)現(xiàn)的,bind的第一個(gè)參數(shù)表示context,就是this。
第三種寫(xiě)法就是普通的寫(xiě)法,之所以會(huì)有前面兩種寫(xiě)法,就是因?yàn)榈谌N寫(xiě)法可能會(huì)出問(wèn)題。
舉個(gè)簡(jiǎn)單的例子,按第三種方式寫(xiě):
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true};
}
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}
這段代碼實(shí)際上是不能工作的,因?yàn)閔andleClick內(nèi)部用到了this.setState,而handleClick執(zhí)行時(shí),this是undefined。
如果想要它工作,可以改成前兩種的寫(xiě)法,或者這樣改:
render() {
return (
<button onClick={ ()=>{ this.handleClick() } }>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
用一個(gè)箭頭函數(shù)將其包裹住
寫(xiě)法一與寫(xiě)法三一樣。不同的是寫(xiě)法一的function為ES6中的箭頭函數(shù),寫(xiě)法三是常見(jiàn)的function.
寫(xiě)法二呢,添加了一個(gè)class的constructor函數(shù)。js的class默認(rèn)無(wú)this,所以我們通常在constructor中將父類(lèi)的this引入,然后bind到該類(lèi)的方法中。但是,ES6中的() => {} //箭頭函數(shù),默認(rèn)會(huì)帶this,也不會(huì)有閉包,所以寫(xiě)法一中的tableHeader 是有this的,寫(xiě)法三中的沒(méi)有。
我也補(bǔ)充一下
你需要去看this關(guān)鍵字的相關(guān)內(nèi)容。
你后面問(wèn)道我是否可以理解為,下面兩種下法是等價(jià)的呢.
其實(shí)不是等價(jià)的,因?yàn)榈诙N每次render都是會(huì)重新創(chuàng)建個(gè)function去包裹handleClick,這很浪費(fèi),也對(duì)性能不利。在JSX中使用.bind(this)也是一樣的,你可以看下jsx-no-bind
北大青鳥(niǎo)APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國(guó)IT技能型緊缺人才,是大數(shù)據(jù)專(zhuān)業(yè)的國(guó)家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國(guó)一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國(guó)成功上市,融資1
北大課工場(chǎng)是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國(guó)家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國(guó)制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國(guó)職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開(kāi)發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_(kāi)發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫(kù),具有快速界面開(kāi)發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁(yè)制作和網(wǎng)頁(yè)游戲開(kāi)發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開(kāi)發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國(guó)Software AG 技術(shù)顧問(wèn),美國(guó)Dachieve 系統(tǒng)架構(gòu)師,美國(guó)AngelEngineers Inc. 系統(tǒng)架構(gòu)師。