原因是 JSX 所做的工作与<template />
标签的用途不同。模板标签的想法是不渲染其子标签,并且几乎像处理未解析的文本一样处理它(浏览器实际上解析它只是为了确保其有效的 html,但仅此而已)
但是当你用 JSX 写这个时:
return (
<template>
<div>some content</div>
</template>
)
您基本上是在指示 react 创建一个'template'
元素,然后创建一个'div'
元素,然后将其作为孩子附加div
到。template
所以在引擎盖下会发生这种情况:
const template = document.createElement('template')
const div = document.createElement('div')
const text = document.createTextNode('some text')
div.appendChild(text)
template.appendChild(div)
但是您想要的是将 的内容设置<template />
为字符串。你可以使用innerHTML
它。
解决方案
一种解决方案是:
render() {
return (
<template
dangerouslySetInnerHTML={{
__html: '<div>some content</div>'
}}
/>
)
}
现在您要求 react 将所有这些子标签创建为节点元素,但让浏览器决定如何处理它们。
更好的解决方案
您可能不想一直使用dangerouslySetInnerHTML
。所以让我们创建一个辅助组件:
function Template({ children, ...attrs }) {
return (
<template
{...attrs}
dangerouslySetInnerHTML={{ __html: children }}
/>
);
}
现在任何时候你需要使用一个模板,你可以像这样使用它:
render() {
return (
<Template>
{'<div>some content</div>'}
</Template>
)
}
不要忘记将内部内容放在引号中,因为它应该是一个字符串。