createElement
createElement 讓您可以建立一個 React 元素。它可以作為撰寫 JSX 的替代方案。
const element = createElement(type, props, ...children)參考
createElement(type, props, ...children)
呼叫 createElement 以使用給定的 type、props 和 children 建立 React 元素。
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello'
);
}參數
-
type:type參數必須是有效的 React 元件類型。例如,它可以是標籤名稱字串(例如'div'或'span'),或是 React 元件(函式、類別或特殊元件,例如Fragment)。 -
props:props參數必須是物件或null。如果您傳遞null,它將被視為空物件。React 將建立一個 props 與您傳遞的props相符的元素。請注意,來自props物件的ref和key是特殊的,在傳回的element上*不會*以element.props.ref和element.props.key的形式提供。它們將以element.ref和element.key的形式提供。 -
選用
...children:零個或多個子節點。它們可以是任何 React 節點,包括 React 元素、字串、數字、入口、空節點(null、undefined、true和false)以及 React 節點的陣列。
回傳
createElement 會回傳一個具有幾個屬性的 React 元素物件。
type:您傳遞的type。props:您傳遞的props,但不包含ref和key。ref:您傳遞的ref。如果缺少,則為null。key:您傳遞的key,強制轉換為字串。如果缺少,則為null。
通常,您會從您的組件回傳元素,或使其成為另一個元素的子元素。雖然您可以讀取元素的屬性,但在建立元素後,最好將每個元素視為不透明,並且只渲染它。
注意事項
-
您必須將 React 元素及其屬性視為不可變的 (immutable),並且在建立後絕不更改其內容。在開發過程中,React 會凍結 (freeze) 回傳的元素及其
props屬性(淺層凍結)來強制執行此操作。 -
當您使用 JSX 時,您必須以大寫字母開頭標籤來渲染您自己的自定義組件。換句話說,
<Something />等同於createElement(Something),但<something />(小寫)等同於createElement('something')(請注意它是一個字串,因此它將被視為內建的 HTML 標籤)。 -
只有在所有子元素都是靜態已知的情況下,才應該將子元素作為多個參數傳遞給
createElement,例如createElement('h1', {}, child1, child2, child3)。如果您的子元素是動態的,請將整個陣列作為第三個參數傳遞:createElement('ul', {}, listItems)。這確保 React 會針對任何動態列表警告您缺少key。對於靜態列表,這不是必要的,因為它們永遠不會重新排序。
用法
不使用 JSX 建立元素
如果您不喜歡JSX 或無法在您的專案中使用它,您可以使用 createElement 作為替代方案。
要建立不使用 JSX 的元素,請使用一些 類型、屬性 和 子元素 來呼叫 createElement。
import { createElement } from 'react';
function Greeting({ name }) {
return createElement(
'h1',
{ className: 'greeting' },
'Hello ',
createElement('i', null, name),
'. Welcome!'
);
}子元素 是選用的,您可以傳遞任意多個子元素(上面的範例有三個子元素)。這段程式碼將會顯示一個帶有問候語的 <h1> 標題。為了比較,以下是使用 JSX 重寫的相同範例。
function Greeting({ name }) {
return (
<h1 className="greeting">
Hello <i>{name}</i>. Welcome!
</h1>
);
}要渲染您自己的 React 組件,請傳遞一個像 Greeting 的函式作為 類型,而不是像 'h1' 的字串。
export default function App() {
return createElement(Greeting, { name: 'Taylor' });
}使用 JSX,它看起來像這樣。
export default function App() {
return <Greeting name="Taylor" />;
}這是一個使用 createElement 撰寫的完整範例。
import { createElement } from 'react'; function Greeting({ name }) { return createElement( 'h1', { className: 'greeting' }, 'Hello ', createElement('i', null, name), '. Welcome!' ); } export default function App() { return createElement( Greeting, { name: 'Taylor' } ); }
以下是使用 JSX 撰寫的相同範例。
function Greeting({ name }) { return ( <h1 className="greeting"> Hello <i>{name}</i>. Welcome! </h1> ); } export default function App() { return <Greeting name="Taylor" />; }
兩種編碼風格都沒問題,因此您可以選擇您喜歡的風格用於您的專案。與 createElement 相比,使用 JSX 的主要好處是它很容易看出哪個結束標籤對應於哪個開始標籤。
深入探討
元素是使用者介面一小部分的輕量級描述。例如,`<Greeting name="Taylor" /> 和 `createElement(Greeting, { name: 'Taylor' })` 都會產生像這樣的物件:
// Slightly simplified
{
type: Greeting,
props: {
name: 'Taylor'
},
key: null,
ref: null,
}請注意,建立這個物件並不會渲染 Greeting 元件或建立任何 DOM 元素。
React 元素更像是一種描述 — 指示 React 之後渲染 Greeting 元件。透過從您的 App 元件返回此物件,您可以告訴 React 接下來要做什麼。
建立元素的成本非常低,因此您不需要嘗試最佳化或避免它。