React PropTypes DOM元素?

mpe*_*pen 25 reactjs react-proptypes

如何将属性标记为必须是DOM元素?

这个页面说这PropTypes.element实际上是一个React元素,那么DOM元素的等价物是什么?

Gre*_*ijn 28

PropTypes.instanceOf(Element)
Run Code Online (Sandbox Code Playgroud)

为我工作.您还可以添加isRequired:

PropTypes.instanceOf(Element).isRequired
Run Code Online (Sandbox Code Playgroud)

  • 您现在可以使用“PropTypes.elementType”,如下所述:/sf/ask/3360512851/ Correct-proptype-for-a-ref-in-react/51127130#51127130 (2认同)
  • 如果您对应用程序进行 SSR,则应该避免使用此选项,因为“Element”在 NodeJS 中将是“未定义”。如果你从你的生产版本中删除你的 PropTypes,你会没事的。但即便如此,您也会在开发构建中抛出错误。 (2认同)

Har*_*rdy 7

您可以检查传递的属性是否为以下实例Element:

Element接口表示Document的对象.此接口描述了各种元素共有的方法和属性.在继承自Element但添加其他功能的接口中描述了特定行为.例如,HTMLElement接口是HTML元素的基本接口,而SVGElement接口是所有SVG元素的基础.

class Some extends React.Component {
  render() {
    return (
      <div> Hello </div>
    );
  }
}

const validateDOMElem = (props, propName, componentName) => {
  if (props[propName] instanceof Element === false) {
    return new Error(
      'Invalid prop `' + propName + '` supplied to' +
      ' `' + componentName + '`. Validation failed.'
    );
  }
}

Some.propTypes = {
  htmlElem: validateDOMElem,
};

const para = document.getElementById('para');

ReactDOM.render(<Some htmlElem={para} />, document.getElementById('app'));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.js"></script>

<div id="app"></div>
<p id="para"></p>
Run Code Online (Sandbox Code Playgroud)

  • 也可以不创建自定义验证器并使用`PropTypes.instanceOf(Element)` (12认同)

小智 6

例如,使用列表组件:

MyList.propTypes = {
  children: PropTypes.instanceOf(<li></li>),
}
Run Code Online (Sandbox Code Playgroud)

适合我.

  • 如果我使用此功能,我会收到警告“失败的道具类型:'instanceof'的右侧不可调用”,这在 2019 年不再起作用吗? (5认同)

Hyd*_*Orc 5

PropTypes.instanceOf(Element)不适用于服务器端渲染,因为ReferenceError: Element is not defined

建议PropTypes.object改用