国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

談?wù)凧avaScript中super(props)的重要性

來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:01:03
文檔

談?wù)凧avaScript中super(props)的重要性

談?wù)凧avaScript中super(props)的重要性:我聽說 Hooks 最近很火。諷刺的是,我想用一些關(guān)于 class 組件的有趣故事來開始這篇文章。你覺得如何? 本文中這些坑對(duì)于你正常使用 React 并不是很重要。 但是假如你想更深入的了解它的運(yùn)作方式,就會(huì)發(fā)現(xiàn)實(shí)際上它們很有趣。 開始第一個(gè)。 首先在我的職業(yè)生
推薦度:
導(dǎo)讀談?wù)凧avaScript中super(props)的重要性:我聽說 Hooks 最近很火。諷刺的是,我想用一些關(guān)于 class 組件的有趣故事來開始這篇文章。你覺得如何? 本文中這些坑對(duì)于你正常使用 React 并不是很重要。 但是假如你想更深入的了解它的運(yùn)作方式,就會(huì)發(fā)現(xiàn)實(shí)際上它們很有趣。 開始第一個(gè)。 首先在我的職業(yè)生

我聽說 Hooks 最近很火。諷刺的是,我想用一些關(guān)于 class 組件的有趣故事來開始這篇文章。你覺得如何?

本文中這些坑對(duì)于你正常使用 React 并不是很重要。 但是假如你想更深入的了解它的運(yùn)作方式,就會(huì)發(fā)現(xiàn)實(shí)際上它們很有趣。

開始第一個(gè)。

首先在我的職業(yè)生涯中寫過的super(props) 自己都記不清:

class Checkbox extends React.Component {
 constructor(props) {
 super(props);
 this.state = { isOn: true };
 }
 // ...
}

當(dāng)然,在類字段提案 (class fields proposal) 中建議讓我們跳過這個(gè)開頭:

class Checkbox extends React.Component {
 state = { isOn: true };
 // ...
}

在2015年 React 0.13 增加對(duì)普通類的支持時(shí),曾經(jīng)打算用這樣的語法。定義constructor和調(diào)用super(props) 始終是一個(gè)臨時(shí)的解決方案,可能要等到類字段能夠提供在工程學(xué)上不那么反人類的替代方案。

不過還是讓我們回到前面這個(gè)例子,這次只用ES2015的特性:

class Checkbox extends React.Component {
 constructor(props) {
 super(props);
 this.state = { isOn: true };
 }
 // ...
}

為什么我們要調(diào)用super? 可以調(diào)用它嗎? 如果必須要調(diào)用,不傳遞prop參數(shù)會(huì)發(fā)生什么? 還有其他參數(shù)嗎? 接下來我們?cè)囈辉嚕?/p>

在 JavaScript 中,super 指的是父類的構(gòu)造函數(shù)。(在我們的示例中,它指向React.Component 的實(shí)現(xiàn)。)

重要的是,在調(diào)用父類構(gòu)造函數(shù)之前,你不能在構(gòu)造函數(shù)中使用this。 JavaScript 是不會(huì)讓你這樣做的:

class Checkbox extends React.Component {
 constructor(props) {
 // 這里還不能用 `this` 
 super(props);
 // 現(xiàn)在可以用了
 this.state = { isOn: true };
 }
 // ...
}

為什么 JavaScript 在使用this之前要先強(qiáng)制執(zhí)行父構(gòu)造函數(shù),有一個(gè)很好的理由能夠解釋。 先看下面這個(gè)類的結(jié)構(gòu):

class Person {
 constructor(name) {
 this.name = name;
 }
}
class PolitePerson extends Person {
 constructor(name) {
 this.greetColleagues(); //這行代碼是無效的,后面告訴你為什么
 super(name);
 }
 greetColleagues() {
 alert('Good morning folks!');
 }
}

如果允許在調(diào)用super之前使用this的話。一段時(shí)間后,我們可能會(huì)修改greetColleagues,并在提示消息中添加Personname

 greetColleagues() {
 alert('Good morning folks!');
 alert('My name is ' + this.name + ', nice to meet you!');
 }

但是我們忘記了super()在設(shè)置this.name之前先調(diào)用了this.greetColleagues()。 所以此時(shí)this.name還沒有定義! 如你所見,像這樣的代碼很難想到問題出在哪里。

為了避免這類陷阱,JavaScript 強(qiáng)制要求:如果想在構(gòu)造函數(shù)中使用this,你必須首先調(diào)用super。 先讓父類做完自己的事! 這種限制同樣也適用于被定義為類的 React 組件:

 constructor(props) {
 super(props);
 // 在這里可以用 `this`
 this.state = { isOn: true };
 }

這里又給我們留下了另一個(gè)問題:為什么要傳props參數(shù)?

你可能認(rèn)為將props傳給super是必要的,這可以使React.Component的構(gòu)造函數(shù)可以初始化this.props

// Inside React
class Component {
 constructor(props) {
 this.props = props;
 // ...
 }
}

這與正確答案很接近了 —— 實(shí)際上它就是這么做的。

但是不知道為什么,即便是你調(diào)用super時(shí)沒有傳遞props參數(shù),仍然可以在render和其他方法中訪問this.props。 (不信你可以親自去試試!)

這是究竟是為什么呢? 事實(shí)證明,在調(diào)用構(gòu)造函數(shù)后,React也會(huì)在實(shí)例上分配props

 // Inside React
 const instance = new YourComponent(props);
 instance.props = props;

因此,即使你忘記將props傳給super(),React 仍然會(huì)在之后設(shè)置它們。 這是有原因的。

當(dāng) React 添加對(duì)類的支持時(shí),它不僅僅增加了對(duì) ES6 類的支持。它的目標(biāo)是盡可能廣泛的支持類抽象。 目前還不清楚 ClojureScript、CoffeeScript、ES6、Fable、Scala.js、TypeScript或其他解決方案是如何相對(duì)成功地定義組件的。 所以 React 故意不關(guān)心是否需要調(diào)用super()—— 即使是ES6類。

那么這是不是就意味著你可以寫super()而不是super(props)呢?

可能不行,因?yàn)樗匀皇橇钊死Щ蟮摹?當(dāng)然,React 稍后會(huì)在你的構(gòu)造函數(shù)運(yùn)行后分配this.props, 但是在調(diào)用super() 之后和構(gòu)造函數(shù)結(jié)束前這段區(qū)間內(nèi)this.props仍然是未定義的:

// Inside React
class Component {
 constructor(props) {
 this.props = props;
 // ...
 }
}
// Inside your code
class Button extends React.Component {
 constructor(props) {
 super(); //我們忘記了傳遞 props 參數(shù)
 console.log(props); // {}
 console.log(this.props); // undefined 
 }
 // ...
}

如果這種情況發(fā)生在從構(gòu)造函數(shù)調(diào)用的某個(gè)方法中,可能會(huì)給調(diào)試工作帶來很大的麻煩。 這就是為什么我建議總是調(diào)用super(props) ,即使在沒有必要的情況之下:

class Button extends React.Component {
 constructor(props) {
 super(props); // 傳遞了 props 參數(shù)
 console.log(props); // {}
 console.log(this.props); // {}
 }
 // ...
}

這樣就確保了能夠在構(gòu)造函數(shù)退出之前設(shè)置好this.props

最后一點(diǎn)是長(zhǎng)期以來 React 用戶總是感到好奇的。

你可能已經(jīng)注意到,當(dāng)你在類中使用Context API時(shí)(無論是舊版的contextTypes或在 React 16.6中新添加的 contextType API),context 會(huì)作為第二個(gè)參數(shù)傳遞給構(gòu)造函數(shù)。

那么為什么我們不寫成super(props, context) 呢? 我們可以這樣做,但是使用context的頻率較低,所以這個(gè)坑并沒有那么多影響。

根據(jù)類字段提案的說明,這些坑大部分都會(huì)消失。 如果沒有顯式構(gòu)造函數(shù),則會(huì)自動(dòng)傳遞所有參數(shù)。 這允許在像state = {} 這樣的表達(dá)式中包含對(duì)this.propsthis.context的引用(如果有必要的話)。

而有了 Hooks 之后,我們甚至不再有superthis。不過這是另外一個(gè)的話題了。

總結(jié)

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

談?wù)凧avaScript中super(props)的重要性

談?wù)凧avaScript中super(props)的重要性:我聽說 Hooks 最近很火。諷刺的是,我想用一些關(guān)于 class 組件的有趣故事來開始這篇文章。你覺得如何? 本文中這些坑對(duì)于你正常使用 React 并不是很重要。 但是假如你想更深入的了解它的運(yùn)作方式,就會(huì)發(fā)現(xiàn)實(shí)際上它們很有趣。 開始第一個(gè)。 首先在我的職業(yè)生
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 亚洲区欧美 | 日本我不卡 | 欧美高清在线视频一区二区 | 91精品成人免费国产 | 亚洲欧美精选 | 国产精品成人一区二区1 | 99热成人精品国产免国语的 | 欧美人与禽zozzo性伦交 | 欧美精品福利 | 国产第四页| 99热成人精品国产免国语的 | 黄毛片| 亚洲高清在线观看视频 | 欧美一区精品二区三区 | 在线免费一区 | 久久久这里有精品999 | 国产成人深夜福利短视频99 | 久久国产精品高清一区二区三区 | 欧美一区二区三区在线观看 | 欧美日韩国产中文字幕 | 中文字幕日韩一区二区三区不卡 | 国产高清不卡一区二区三区 | 亚洲va在线va天堂va四虎 | 国产在线观看入口 | 亚洲国产成人久久综合区 | 欧美日韩亚洲精品国产色 | 欧美精品免费在线 | 精品欧美一区二区在线观看欧美熟 | 欧美日韩亚洲综合 | 久久亚洲精品中文字幕60分钟 | 精品在线免费观看 | 在线播放精品一区二区啪视频 | 久久婷婷国产麻豆91天堂 | 乱妇伦交 | 日韩亚洲欧美视频 | 免费网站看v片在线成人国产系列 | 亚洲精品乱码久久久久 | 国产精品1000部在线观看 | 国产一区二区三区精品视频 | 欧美另类在线观看 | 美女a毛片 |