Vue的JSX源碼是 Vue.js 3 中新增的特性,它是一種將 JavaScript 和 HTML 結合起來寫的語法,能夠讓我們在組件中更加直觀地描述視圖的結構。以下是JSX源碼的具體內容。
export const h = (type, propsOrChildren, ...children) => {
const l = children.length;
if (l === 1 && typeof children[0] === 'function' && !children[0].render) {
return children[0](propsOrChildren);
}
let props;
if (propsOrChildren != null && propsOrChildren !== Object(propsOrChildren)) {
children.unshift(propsOrChildren);
props = {};
} else {
props = propsOrChildren || {};
}
return createVNode(type, normalizeProps(props), l === 1 ? normalizeChildren(children[0]) : normalizeChildren(children));
};
可以看到,這段代碼實際上定義了一個名為 h 的函數,它接收三個參數:type 表示渲染的元素類型,propsOrChildren 表示渲染元素的屬性和/或子元素,而 ...children 表示子元素列表。
在函數內部,會根據子元素的數量以及屬性是否存在來對子元素列表進行處理。如果只有一個函數組件且沒有其他子元素或屬性,則直接調用該組件并返回它的渲染結果。否則,將子元素列表和屬性分別進行處理、標準化。
最后,再調用 createVNode 方法創建一個虛擬節點,并將標準化后的屬性和子元素添加到節點對象中,最終返回該節點。