溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

react中元素和組件有哪些區(qū)別

發(fā)布時間:2020-11-18 10:42:56 來源:億速云 閱讀:232 作者:小新 欄目:web開發(fā)

了解react中元素和組件有哪些區(qū)別?這個問題可能是我們?nèi)粘W(xué)習(xí)或工作經(jīng)常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家?guī)淼膮⒖純?nèi)容,讓我們一起來看看吧!

react中元素和組件的區(qū)別:1、元素?cái)?shù)據(jù)結(jié)構(gòu)是普通對象,而組件數(shù)據(jù)結(jié)構(gòu)是類或純函數(shù);2、在JSX中,被元素嵌套的元素會以屬性children的方式傳入該元素的組件。

react中元素和組件的區(qū)別:

1、React 元素

React 元素(React element),它是 React 中最小基本單位,我們可以使用 JSX 語法輕松地創(chuàng)建一個 React 元素:

const element = <div className="element">I'm element</div>

React 元素不是真實(shí)的 DOM 元素,它僅僅是 js 的普通對象(plain objects),所以也沒辦法直接調(diào)用 DOM 原生的 API。上面的 JSX 轉(zhuǎn)譯后的對象大概是這樣的:

{
    _context: Object,
    _owner: null,
    key: null,
    props: {
    className: 'element',
    children: 'I'm element'
  },
    ref: null,
    type: "div"
}

只有在這個元素渲染被完成后,才能通過選擇器的方式獲取它對應(yīng)的 DOM 元素。不過,按照 React 有限狀態(tài)機(jī)的設(shè)計(jì)思想,應(yīng)該使用狀態(tài)和屬性來表述組件,要盡量避免 DOM 操作,即便要進(jìn)行 DOM 操作,也應(yīng)該使用 React 提供的接口ref和getDOMNode()。一般使用 React 提供的接口就足以應(yīng)付需要 DOM 操作的場景了,因此像 jQuery 強(qiáng)大的選擇器在 React 中幾乎沒有用武之地了。

除了使用 JSX 語法,我們還可以使用 React.createElement()React.cloneElement() 來構(gòu)建 React 元素。

React.createElement()

JSX 語法就是用React.createElement()來構(gòu)建 React 元素的。它接受三個參數(shù),第一個參數(shù)可以是一個標(biāo)簽名。如div、span,或者 React 組件。第二個參數(shù)為傳入的屬性。第三個以及之后的參數(shù),皆作為組件的子組件。

React.createElement(
    type,
    [props],
    [...children]
)

React.cloneElement()

React.cloneElement()與React.createElement()相似,不同的是它傳入的第一個參數(shù)是一個 React 元素,而不是標(biāo)簽名或組件。新添加的屬性會并入原有的屬性,傳入到返回的新元素中,而就的子元素獎杯替換。

React.cloneElement(
  element,
  [props],
  [...children]
)

2、React 組件

React 中有三種構(gòu)建組件的方式。React.createClass()、ES6 class和無狀態(tài)函數(shù)。

React.createClass()

React.createClass()是三種方式中最早,兼容性最好的方法。在0.14版本前官方指定的組件寫法。

var Greeting = React.createClass({
  render: function() {
    return <h2>Hello, {this.props.name}</h2>;
  }
});

ES6 class

ES6 class是目前官方推薦的使用方式,它使用了ES6標(biāo)準(zhǔn)語法來構(gòu)建,但它的實(shí)現(xiàn)仍是調(diào)用React.createClass()來實(shí)現(xiàn)了,ES6 class的生命周期和自動綁定方式與React.createClass()略有不同。

class Greeting extemds React.Component{
  render: function() {
    return <h2>Hello, {this.props.name}</h2>;
  }
};

無狀態(tài)函數(shù)

無狀態(tài)函數(shù)是使用函數(shù)構(gòu)建的無狀態(tài)組件,無狀態(tài)組件傳入props和context兩個參數(shù),它沒有state,除了render(),沒有其它生命周期方法。

function Greeting (props) {
  return <h2>Hello, {props.name}</h2>;
}

React.createClass()和ES6 class構(gòu)建的組件的數(shù)據(jù)結(jié)構(gòu)是類,無狀態(tài)組件數(shù)據(jù)結(jié)構(gòu)是函數(shù),它們在 React 被視為是一樣的。

3、元素與組件的區(qū)別

組件是由元素構(gòu)成的。元素?cái)?shù)據(jù)結(jié)構(gòu)是普通對象,而組件數(shù)據(jù)結(jié)構(gòu)是類或純函數(shù)。除此之外,還有幾點(diǎn)區(qū)別要注意:

this.props.children

在 JSX 中,被元素嵌套的元素會以屬性 children 的方式傳入該元素的組件。當(dāng)僅嵌套一個元素時,children 是一個 React 元素,當(dāng)嵌套多個元素時,children 是一個 React 元素的數(shù)組??梢灾苯影?children 寫入 JSX 的中,但如果要給它們傳入新屬性,就要用到React.cloneElement()來構(gòu)建新的元素。我曾放過以下錯誤:

render () {
  var Child = this.props.children
  return <div><Child tip={'error!'}/><div>
}

因?yàn)?Child 是一個 React 元素,而不是組件,這樣的寫法是完全錯誤的,正確的方式應(yīng)該是:

render () {
  var child = this.props.children
  return <div>{ React.cloneElement(child, {tip: 'right way!'}) }<div>
}

就這樣,原有屬性和新添加的屬性被一并傳入了子元素。使用React.cloneElement()才是操作元素的正確姿勢。

用戶組件

有的時候,組件可以讓用戶以屬性的方式傳入自定義的組件,來提升組件的靈活性。這個屬性傳入的就應(yīng)該是 React 元素,而非 React 組件。使用 React 元素可以讓用戶傳入自定義組件的同時,為組件添加屬性。同樣,可以使用React.cloneElement()為自定義組件添加更多屬性,或替換子元素。

// 推薦
<MyComponent tick={
  <UserComponent tip="Yes"/>
} />
 
// 不推薦
<MyComponent tick={ UserComponent } />

最后,打個不恰當(dāng)?shù)谋扔?,React 組件是MyComponent,React 元素就是<MyComponent />。

感謝各位的閱讀!看完上述內(nèi)容,你們對react中元素和組件有哪些區(qū)別大概了解了嗎?希望文章內(nèi)容對大家有所幫助。如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI