【发布时间】:2020-07-22 15:29:04
【问题描述】:
我正在尝试使用 JSX 本身(没有 React)来呈现一些动态内容,并带有一个自定义的 createElement 函数。我正在使用具有以下设置的 webpack:{ "pragma": "createElement", "pragmaFrag": "'fragment'" } for @babel/plugin-transform-react-jsx。
这是我的自定义渲染器代码:
function createElement(tagName, attrs = {}, ...children) {
let el = document.createElement(tagName);
if (attrs) {
for (let [ key, val ] of Object.entries(attrs)) {
if (key === 'className') {
el.className = val;
} else {
el.setAttribute(key, val);
}
}
}
for (let child of children) {
if (Array.isArray(child)) el.append(...child);
else el.append(child);
}
return el;
}
我很好奇如何在这个函数中处理片段元素 (<>content</>)。通过谷歌搜索,我发现人们添加了以下内容:
function createElement() {
// ...
if (tagName === 'fragment') return children;
// ...
return el;
}
但这只是返回字符串"[object HTMLLIElement]",这对我来说是因为createElement似乎必须返回一个节点元素,而不是NodeList或某种数组。
有没有办法在我的 createElement 函数中轻松实现片段?谢谢
编辑:
使用下面 T.J. 的回答,我能够通过添加以下行来解决问题,以利用 DocumentFragment:
let el = tagName === 'fragment' ? new DocumentFragment() : document.createElement(tagName);
【问题讨论】:
标签: javascript jsx