<div> 不能作为 <p> 的后代出现

IT技术 javascript reactjs
2021-05-19 23:47:08

我看到这个。它抱怨的是什么并不神秘:

Warning: validateDOMnesting(...): <div> cannot appear as a descendant of <p>. See ... SomeComponent > p > ... > SomeOtherComponent > ReactTooltip > div.

我是SomeComponentand的作者SomeOtherComponent但后者使用的是外部依赖(ReactTooltipfrom react-tooltip)。这是一个外部依赖项可能并不重要,但它让我在这里尝试论证它是“一些超出我控制的代码”。

考虑到嵌套组件工作正常(表面上),我应该如何担心这个警告?无论如何我将如何改变它(假设我不想重新实现外部依赖)?是否有我尚未意识到的更好的设计?

为了完整起见,这里是SomeOtherComponent. 它只是呈现this.props.value,当悬停时:一个工具提示,上面写着“一些工具提示消息”:

class SomeOtherComponent extends React.Component {
  constructor(props) {
    super(props)
  }

  render() {
    const {value, ...rest} = this.props;
    return <span className="some-other-component">
      <a href="#" data-tip="Some tooltip message" {...rest}>{value}</a>
      <ReactTooltip />
    </span>
  }
}

谢谢你。

4个回答

如果在使用 Material UI <Typography> https://material-ui.com/api/typography/时发生此错误,那么您可以通过更改元素属性轻松将其更改<p>为 a <span>component<Typography>

<Typography component={'span'} variant={'body2'}>

根据排版文档:

component :用于根节点的组件。使用 DOM 元素或组件的字符串。默认情况下,它将变体映射到一个好的默认标题组件。

所以排版选择<p>作为一个明智的默认,你可以改变。可能会带来副作用......对我有用。

根据警告消息,组件 ReactTooltip 呈现可能如下所示的 HTML:

<p>
   <div>...</div>
</p>

根据此文档<p></p>标签只能包含内联元素。这意味着在其中放置<div></div>标签应该是不正确的,因为div标签是块元素。不正确的嵌套可能会导致渲染额外标签等故障,这会影响您的 javascript 和 css。

如果你想摆脱这个警告,你可能需要自定义 ReactTooltip 组件,或者等待创建者修复这个警告。

如果您正在寻找发生这种情况的地方,您可以在控制台中使用: document.querySelectorAll(" p * div ")

您的组件可能会在另一个组件(例如<Typography> ... </Typography>)中呈现因此,它会将您的组件加载到<p> .. </p>不允许的 a 中。

修复:删除,<Typography>...</Typography>因为这仅用于 a<p>...</p>或任何其他文本元素(如标题)内的纯文本