react使用危险的SetInnerHTML 渲染带有 html 标签的 json

IT技术 javascript html json reactjs eslint
2021-05-01 13:11:51

我正在尝试在列表中的字符串中呈现带有 html 标签的 json 列表,如下所示jsbin它适用于 Jsbin。但是在我的控制台中,我收到了以下警告:

warning  Only set one of `children` or `props.dangerouslySetInnerHTML` react/no-danger-with-children

只是想知道是否有其他方法可以使用危险的SetInnerHTML 呈现列表以避免警告?

const displayList = [
    {
        item: 1,
        text: "<strong>ABC</strong> this should be strong."
    },
    {
        item: 2,
        text: "<a>ABC</a> this should be link."
    },
    {
        item: 3,
        text: "normal text"
    }
];

const App = () => (
    <ul>
        {displayList.map((item, i) => (
            <li key={i}>
                <div dangerouslySetInnerHTML={{
                    __html: item.text
                }}>
                </div>
            </li>
        ))}
    </ul>
);

ReactDOM.render(
    <App />,
    document.getElementById('root')
);
3个回答

React 抱怨dangerouslySetInnerHTML与安全react儿童一起使用,当你让 div 标签打开到这样的特性时就会发生这种情况<div>open and ready for children</div>

由于您使用的是 JSX 语法扩展,因此这里的解决方案是将整个句子写在一行中:

<div dangerouslySetInnerHTML={{__html: item.text}}></div>

或仅使用单例 div 标签:

<div dangerouslySetInnerHTML={{
       __html: item.text
     }}/>

顺便说一下,您没有在 jsbin 上收到错误,因为它是一个 React 生产构建,这个构建并不是要告诉您可以写得更好的内容。

删除div组件中元素的封闭标记,使其看起来像以下代码:

<li key={i}>
    <div dangerouslySetInnerHTML={{
      __html: item.text
     }} />
</li>

根据这个,应该删除警告。

如果您使用 ESLint,请在危险的 SetInnerHTML 和内部 div 元素上添加内联注释

<div
   // eslint-disable-next-line react/no-danger
   dangerouslySetInnerHTML={{ __html: html }}
/>