如何在没有包装器 div 的情况下使用危险的SetInnerHTML?

bsi*_*des 4 reactjs gatsby

我的 HTML 内容来自 API(在本例中为 Gatsby),因此我dangerouslySetInnerHTML按照推荐使用。问题是,它扰乱了我的样式,特别是网格。我有一个这样的 html 标记:

<article>
    <h2>Title of the post<h2>
    <small>Date of the post</small>
    <div dangerouslySetInnerHTML={{ __html: post.html }} />
</article>
Run Code Online (Sandbox Code Playgroud)

这个<article>标签包含一个display: grid样式。但是该 div 中的所有内容都占用了宝贵的空间,因此难以设置样式(这也不是一个有用的 div!)。所有重要的 html 都在里面,但我想去掉实际的<div>标签。有什么办法吗?

注意:我已经{post.html}直接尝试过,但它是无法解码的编码URI。

谢谢!

ksa*_*sav 5

查看危险地SetInnerHTMLreact 文档

你可以直接从 React 设置 HTML,但是你必须危险地输入 SetInnerHTML 并传递一个带有 __html 键的对象......

因此,没有什么可以阻止您从 graphql 查询的不同部分形成自己的 html 字符串,如下所示:

const createFullPostMarkup = () => {
    return { __html: `<h2>Title of the post</h2><small>Date of the post</small>${ post.html }` }
}
Run Code Online (Sandbox Code Playgroud)

然后将其设置为您文章中的内部 html,如下所示:

<article dangerouslySetInnerHTML={createFullPostMarkup()} />
Run Code Online (Sandbox Code Playgroud)

请记住,这只是一个带有__html键的对象。你可以在里面放任何东西。

注意:我认为您可能会在此开放功能请求中描述。对于您的用例,我认为上述解决方案非常有效。但是,如果您仍然不满意,请查看链接问题中的讨论。

  • 虽然它适用于我的特定问题,但它当然仍然会在“&lt;article&gt;”下面创建一个新的“&lt;article&gt;”,这根本不是语义的。所以我仍在寻找一种语义方式来做到这一点。 (2认同)