真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

新手學(xué)習(xí)react迷惑的點(diǎn)(一)-創(chuàng)新互聯(lián)

在寫 React 的時(shí)候,你可能會(huì)寫類似這樣的代碼:

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),江都企業(yè)網(wǎng)站建設(shè),江都品牌網(wǎng)站建設(shè),網(wǎng)站定制,江都網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,江都網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
import?React?from?'react'
function?A()?{
?//?...other?code
?return?

前端桃園

} 復(fù)制代碼

你肯定疑惑過,上面的代碼都沒有用到 React,為什么要引入 React 呢?

如果你把 import React from ‘react’ 刪掉,還會(huì)報(bào)下面這樣的錯(cuò)誤:

新手學(xué)習(xí) react 迷惑的點(diǎn)(一)

那么究竟是哪里用到了這個(gè) React,導(dǎo)致我們引入 React 會(huì)報(bào)錯(cuò)呢,不懂這個(gè)原因,那么就是 JSX 沒有搞得太明白。

你可以講上面的代碼(忽略導(dǎo)入語句)放到在線 babel 里進(jìn)行轉(zhuǎn)化一下,發(fā)現(xiàn) babel 會(huì)把上面的代碼轉(zhuǎn)化成:

function?A()?{
?//?...other?code
?return?React.createElement("h2",?null,?"前端桃園");
}
復(fù)制代碼

因?yàn)閺谋举|(zhì)上講,JSX 只是為 React.createElement(component, props, ...children) 函數(shù)提供的語法糖。

為什么要用 className 而不用 class

  1. React 一開始的理念是想與瀏覽器的 DOM API 保持一直而不是 HTML,因?yàn)?JSX 是 JS 的擴(kuò)展,而不是用來代替 HTML 的,這樣會(huì)和元素的創(chuàng)建更為接近。在元素上設(shè)置 class 需要使用 className 這個(gè) API:

const?element?=?document.createElement("div")
element.className?=?"hello"?
復(fù)制代碼
  1. 瀏覽器問題,ES5 之前,在對象中不能使用保留字。以下代碼在 IE8 中將會(huì)拋出錯(cuò)誤:

const?element?=?{
?attributes:?{
?class:?"hello"
?}
}?
復(fù)制代碼
  1. 解構(gòu)問題,當(dāng)你在解構(gòu)屬性的時(shí)候,如果分配一個(gè) class 變量會(huì)出問題:

const?{?class?}?=?{?class:?'foo'?}?//?Uncaught?SyntaxError:?Unexpected?token?}
const?{?className?}?=?{?className:?'foo'?}?
const?{?class:?className?}?=?{?class:?'foo'?}?
復(fù)制代碼

其他討論可見:有趣的話題,為什么jsx用className而不是class

為什么屬性要用小駝峰

因?yàn)?JSX 語法上更接近 JavaScript 而不是 HTML,所以 React DOM 使用 camelCase(小駝峰命名)來定義屬性的名稱,而不使用 HTML 屬性名稱的命名約定。

來自 JSX 簡介

為什么 constructor 里要調(diào)用 super 和傳遞 props

這是官網(wǎng)的一段代碼,具體見:狀態(tài)(State) 和 生命周期

class?Clock?extends?React.Component?{
?constructor(props)?{
?super(props);
?this.state?=?{date:?new?Date()};
?}
?render()?{
?return?(
?
?

Hello,?world!

?

It?is?{this.state.date.toLocaleTimeString()}.

?
?); ?} } 復(fù)制代碼

而且有這么一段話,不僅讓我們調(diào)用 super 還要把 props 傳遞進(jìn)去,但是沒有告訴我們?yōu)槭裁匆@么做。

新手學(xué)習(xí) react 迷惑的點(diǎn)(一)

不知道你有沒有疑惑過為什么要調(diào)用 super 和傳遞 props,接下來我們來解開謎題吧。

為什么要調(diào)用 super

其實(shí)這不是 React 的限制,這是 JavaScript 的限制,在構(gòu)造函數(shù)里如果要調(diào)用 this,那么提前就要調(diào)用 super,在 React 里,我們常常會(huì)在構(gòu)造函數(shù)里初始化 state,this.state = xxx ,所以需要調(diào)用 super。

為什么要傳遞 props

你可能以為必須給 super 傳入 props,否則 React.Component 就沒法初始化 this.props:

class?Component?{
?constructor(props)?{
?this.props?=?props;
?//?...
?}
}
復(fù)制代碼

不過,如果你不小心漏傳了 props,直接調(diào)用了 super(),你仍然可以在 render 和其他方法中訪問 this.props(不信的話可以試試嘛)。

為啥這樣也行?因?yàn)镽eact 會(huì)在構(gòu)造函數(shù)被調(diào)用之后,會(huì)把 props 賦值給剛剛創(chuàng)建的實(shí)例對象:

const?instance?=?new?YourComponent(props);
instance.props?=?props;
復(fù)制代碼

props 不傳也能用,是有原因的。

但這意味著你在使用 React 時(shí),可以用 super() 代替 super(props) 了么?

那還是不行的,不然官網(wǎng)也不會(huì)建議你調(diào)用 props 了,雖然 React 會(huì)在構(gòu)造函數(shù)運(yùn)行之后,為 this.props 賦值,但在 super() 調(diào)用之后與構(gòu)造函數(shù)結(jié)束之前, this.props 仍然是沒法用的。

//?Inside?React
class?Component?{
?constructor(props)?{
?this.props?=?props;
?//?...
?}
}
//?Inside?your?code
class?Button?extends?React.Component?{
?constructor(props)?{
?super();?//??忘了傳入?props
?console.log(props);?//???{}
?console.log(this.props);?//??undefined
?}
?//?...
}
復(fù)制代碼

要是構(gòu)造函數(shù)中調(diào)用了某個(gè)訪問 props 的方法,那這個(gè) bug 就更難定位了。因此我強(qiáng)烈建議始終使用super(props),即使這不是必須的:

class?Button?extends?React.Component?{
?constructor(props)?{
?super(props);?//???We?passed?props
?console.log(props);?//???{}
?console.log(this.props);?//???{}
?}
?//?...
}
復(fù)制代碼

上面的代碼確保 this.props 始終是有值的。

如果你想避免以上的問題,你可以通過class 屬性提案 來簡化代碼:

class?Clock?extends?React.Component?{
?state?=?{date:?new?Date()};
?render()?{
?return?(
?
?

Hello,?world!

?

It?is?{this.state.date.toLocaleTimeString()}.

?
?); ?} } 復(fù)制代碼

更詳細(xì)的內(nèi)容可見Dan 的博客

為什么組件用大寫開頭

前面以及說過了,JSX 是 React.createElement(component, props, …children) 提供的語法糖,component 的類型是:string/ReactClass type,我們具體看一下在什么情況下會(huì)用到 string 類型,什么情況下用到 ReactClass type 類型

  • string 類型react會(huì)覺得他是一個(gè)原生dom節(jié)點(diǎn)

  • ReactClass type 類型 自定義組件

例如(string):在 jsx 中我們寫一個(gè)

復(fù)制代碼

轉(zhuǎn)換為js的時(shí)候就變成了

React.createElement("div",?null)
復(fù)制代碼

例如(ReactClass type):在jsx中我們寫一個(gè)

function?MyDiv()?{
?return?(
) } 復(fù)制代碼

轉(zhuǎn)換為js的時(shí)候就變成了

function?MyDiv()?{
?return?React.createElement("div",?null);
}
React.createElement(MyDiv,?null);
復(fù)制代碼

上邊的例子中如果將MyDiv中的首字母小寫,如下

function?myDiv()?{
?return?(
) } 復(fù)制代碼

轉(zhuǎn)換為 js 的時(shí)候就變成了

function?myDiv()?{
?return?React.createElement("div",?null);
}
React.createElement("myDiv",?null);
復(fù)制代碼

由于找不到 myDiv 這個(gè) dom,所以就會(huì)報(bào)錯(cuò)。

后記

這是這個(gè)系列的第一篇,這些問題也是在我的一個(gè)「React交流群」里大家提出來的一些他們剛學(xué) react 的時(shí)候容易迷惑的點(diǎn),下一篇不出意外就是解答以下迷惑的點(diǎn),如果有其他的問題想知道的,歡迎在評論區(qū)留言。

新手學(xué)習(xí) react 迷惑的點(diǎn)(一)

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


新聞標(biāo)題:新手學(xué)習(xí)react迷惑的點(diǎn)(一)-創(chuàng)新互聯(lián)
文章URL:http://weahome.cn/article/dcjhip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部