从 React 元素获取 HTML 标签名称?

IT技术 reactjs react-jsx
2021-05-04 21:10:38

是否可以从 React 元素(从组件返回)获取 HTML 标记名称?例如:

function Foo() {
    return <span>Hello</span>;
}

HTML 标记名称将为span. 我知道你可以查看typeReact 元素属性,但是在 SFC 和普通组件之间真的很难,当组件深度相当大时更难。例如:

function Bar() {
    return <Foo />;
}

应该还是回来span

3个回答

不。

React Elements 是一个虚拟构造,它们不直接表示 DOM 元素。有两种类型的 React 元素 - “常规” HTML DOM 元素和 React 类的实例化。第一个有“型”,因为它是非常简单的,无状态的,和不可改变的,并且只被创建以呈现其对应的DOM元素(但不与DOM元素本身混淆!)这方面的一个例子是,<div>Foo</div>在JSX 或React.createElement("div", null, "Foo")在 JS 中。

然而,React 类的实例没有“类型”,因为它们不代表典型的 DOM 元素。当我们实例化一个 React 类时,我们称它为“组件”,以将其标识为该类的单个实例,具有render方法、封装状态等。无法检索组件的“类型”,因为实际的 DOM 元素是它将呈现完全取决于其内部状态以及render方法决定返回的内容。一个例子是在某处定义的 React 类,然后用<Foo />实例化React.createElement(Foo)

了解组件实际渲染哪些 DOM 元素的唯一方法是,挂载并渲染它并查看它的作用。组件本身没有固有的“类型”。可以想象,您可以挂载一个组件,用于ref在渲染时捕获 DOM 元素,然后使用回调函数将此信息传递回父级。

var Child = React.createClass({
  render: function() {
    return <div ref={function(el){this.props.whatElementAmI(el)}.bind(this)} >Oh My!</div>
  }
});

var Parent = React.createClass({
  whatElementAmI: function(el) {
    console.log(el.nodeName); // "DIV"
  },
  render: function() {
    return <div><Child whatElementAmI={this.whatElementAmI.bind(this)} /></div>
  }
});

https://facebook.github.io/react/docs/glossary.html#react-elements

是的。

import { renderToString } from 'react-dom/server';

const Span = () => <span>hello</span>
renderToString(<Span />)
// "<span>hello</span>"

然后使用正则表达式获取标签。

你可以使用 React 的Top-Level API来抓取 DOM 节点。两个警告:1)这不适用于无状态功能组件,因为您不能将 refs 放在它们上,并且 2)它仅在组件输出本机 DOM 元素时才有效,因此它在第二种情况下不起作用该组件输出另一个 React 组件。

import ReactDOM from 'react-dom';

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

class Container extends React.Component {
  componentDidMount() {
    var domNode = ReactDOM.findDOMNode(this._component);
    console.log(domNode.tagName); // "DIV"
  }
  render() {
    return <MyComponent ref={(c) => this._component = c} />
  }
}