ReactJS 组件名称必须以大写字母开头吗?

IT技术 javascript reactjs
2021-01-12 10:07:38

我正在JSBin上使用 ReactJS 框架

我注意到如果我的组件名称以小写字母开头,则它不起作用。

例如,以下不呈现:

var fml = React.createClass({
  render: function () {
    return <a href='google.com'>Go</a>
  }
});

React.render(<fml />, document.body);

但是一旦我fmlFml替换它就会渲染。

有什么原因我不能用小写字母开始标签吗?

6个回答

在 JSX 中,小写的标签名称被认为是 HTML 标签。但是,带有点(属性访问器)的小写标记名称不是。

请参阅HTML 标签与 React 组件

  • <component />编译为React.createElement('component')(html标签)
  • <Component /> 编译为 React.createElement(Component)
  • <obj.component /> 编译为 React.createElement(obj.component)
我试过<components[name] />哪个也不起作用。
2021-03-11 10:07:38
我不敢相信我之前没有注意到有这样的规则。
2021-03-18 10:07:38
是的,这对 n00bs 来说可能非常令人反感,因为如果调用Components而不是components,他们可爱的网站将加载而没有错误但没有内容!
2021-03-19 10:07:38
再增加半小时到柜台。我快疯了,试图渲染类似的东西let component = components[compType]; <component/>,并得到无意义的错误。
2021-04-02 10:07:38
这是一个坏主意。我在这里很礼貌。
2021-04-08 10:07:38

@Alexandre Kirszenberg给出了一个很好的答案,只是想添加另一个细节。

React 曾经包含一个众所周知的元素名称的白名单,例如divetc,用于区分 DOM 元素和 React 组件。

但是因为维护这个列表并不是那么有趣,而且因为 Web 组件可以创建自定义元素,所以他们制定了一个规则,所有 React 组件必须以大写字母开头,或者包含一个点

这是什么时候改变的?
2021-04-04 10:07:38
很好的信息,如果有官方文档参考就更好了。谢谢。
2021-04-05 10:07:38

官方react参考

当元素类型以小写字母开头时,它指的是像或这样的内置组件,并导致传递给 React.createElement 的字符串“div”或“span”。以大写字母开头的类型,如 compile to React.createElement(Foo) 并对应于在 JavaScript 文件中定义或导入的组件。

另请注意:

我们建议使用大写字母命名组件。如果您确实有一个以小写字母开头的组件,请在将其用于 JSX 之前将其分配给一个大写的变量。

这意味着必须使用:

const Foo = foo;foo用作 JSX 中的 Component 元素之前

JSX标签的第一部分决定了 React 元素的类型,基本上有一些约定大写、小写、点符号

大写和点符号类型表示该JSX标签指的是 React 组件,因此如果您使用 JSX <Foo />compile to React.createElement(Foo)
OR
<foo.bar />compile toReact.createElement(foo.bar)并对应于在您的 JavaScript 文件中定义或导入的组件。

小写类型指示内置组件,如<div><span>并导致字符串'div''span'传递给React.createElement('div')

React 建议使用大写字母命名组件。如果您确实有一个以小写字母开头的组件,请在将其用于JSX.

在 JSX 中,React 类被大写以使 XML 兼容,因此不会被误认为是 HTML 标签。如果 react 类没有大写,则它是一个 HTML 标记,作为预定义的 JSX 语法。