代码之家  ›  专栏  ›  技术社区  ›  isar

JSX语法和React之间的差异。createElement()

  •  4
  • isar  · 技术社区  · 7 年前

    我正在看 React Boilerplate 我注意到,当我将语法从JSX更改为常规JS时(使用 React.createElement )我有警告 Each child in an array or iterator should have a unique "key" prop 。所以我想JSX做了一些额外的事情。
    真正的区别是什么?
    是否可以在不使用JSX或不提供密钥的情况下修复此警告?

    为了清楚起见,这是给我一个警告的片段:

    React.createElement(AppWrapper, {}, [
      React.createElement(Helmet, {titleTemplate: "Boilerplate"},
        React.createElement('meta', {name: "description"})
      ),
      React.createElement(Switch, {}, [
        React.createElement(Route, {exact: true, path: "/", component: HomePage}),
        React.createElement(Route, {path: "/features", component: FeaturePage}),
      ]),
      React.createElement(Footer)
    ])
    

    这是JSX,它没有给我任何警告:

    <AppWrapper>
      <Helmet titleTemplate="Boilerplate">
        <meta name="description" />
      </Helmet>
      <Header />
      <Switch>
        <Route exact path="/" component={HomePage} />
        <Route path="/features" component={FeaturePage} />
      </Switch>
      <Footer />
    </AppWrapper>
    
    2 回复  |  直到 3 年前
        1
  •  2
  •   Ursus    7 年前

    这很简单。当您仅将一个元素作为另一个元素的子元素传递时,该元素不应是数组。

    React.createElement(AppWrapper, {}, 
      React.createElement(Helmet, {titleTemplate: "Boilerplate"},
        React.createElement('meta', {name: "description"})
      ),
      React.createElement(Switch, {},
        React.createElement(Route, {exact: true, path: "/", component: HomePage}),
      ),
      React.createElement(Footer)
    )
    

    否则就像在JSX中一样

    <Helmet titleTemplate="Boilerplate">
       {['description'].map(description => <meta name={description} />)}
    </Helmet>
    

    这需要 key

        2
  •  0
  •   Mike Kor    7 年前

    如果要渲染数组元素,react总是要求为其提供键。检查此项 doc 有关渲染元素列表的详细信息