【问题标题】:React component closing tagReact 组件结束标签
【发布时间】:2018-08-06 01:39:49
【问题描述】:

我是 React 新手,我正在尝试弄清楚 的用途/用途。除了自动关闭标签,我似乎找不到任何信息。

我已经创建了一个基本的标签滚动条作为JSFiddle 使用自关闭 和后续道具,我想知道是否有比我所做的更好的在 React 中编写的方法。

class TabScroller extends React.Component {

  render() {
    return (
      <div className="tabScroller">
        <div className="NavList">
          <TabNav handleClick={this.handleNavClick} />
          <TabList 
            tabs={this.state.tabs} 
            activeTab={this.state.activeTab}
            scrollPosition={this.state.scrollPosition} 
            handleClick={this.handleTabClick}
          />
        </div>
        <TabContent content={this.state.tabs[this.state.activeTab].content} />
      </div>
    );
  }
}

// ========================================

ReactDOM.render(
  <TabScroller />,
  document.getElementById('root')
);

【问题讨论】:

    标签: javascript reactjs components


    【解决方案1】:

    自闭标签的目的仅仅是因为它更紧凑。当所述组件没有您通常包裹在父组件周围的任何子组件时,这尤其有用。

    所以通常对于 叶组件(即没有任何子组件的组件),您使用自闭合语法。喜欢:&lt;Component /&gt;。即使它有道具,你也可以这样做:&lt;Component foo="bar" /&gt;

    但是,请记住 children 是一个道具,所以您可以在技术上这样做:

    &lt;Component children={&lt;span&gt;foo&lt;/span&gt;} /&gt;

    但我发现它的可读性较差并建议不要使用它(阅读下面的免责声明)。


    总而言之,这些是等价的:

    • &lt;Component /&gt; = &lt;Component&gt;&lt;/Component&gt;
    • &lt;Component foo="bar" /&gt; = &lt;Component foo="bar"&gt;&lt;/Component&gt;
    • &lt;Component children={&lt;span&gt;foo&lt;/span&gt;}&gt;&lt;/Component&gt; =

      &lt;Component&gt;&lt;span&gt;foo&lt;/span&gt;&lt;/Component&gt;

    您可以使用您喜欢的任何方法。虽然实践是在没有孩子的情况下使用速记版本。


    免责声明:虽然通过对象键值定义 childen 属性在技术上可行,但强烈建议不要这样做,因为它会破坏API,因为它应该被使用。仅当您对自己所做的事情有信心时才使用此版本。

    【讨论】:

    • 有趣的是,children={...} 表单似乎没有记录; Introducing JSX > Specifying Children with JSXJSX In Depth > Children In JSX 中没有提到它。文档还将props.children 称为“特殊”属性。当然,我们知道 JSX 被转换为带有 children 选项属性的 React.createElement 调用,但是......虽然它目前可能有效,但我想我要么避免提及它,要么使用更强大的免责声明。
    • @Chimera.Zen T.J.Crowder 表示不应将children 属性传递&lt;Component children={...} /&gt;,而只能作为&lt;Component&gt;{...}&lt;/Component&gt;。但是,访问 children 可以而且应该通过props.children 完成。不要混淆传递和访问。
    • @Chimera.Zen:见上面克里斯的评论,我只是在谈论children={&lt;span&gt;foo&lt;/span&gt;}。要使用孩子,你可以使用props.children,这很好(事实上,你别无选择)。
    • @Chris:我认为你的意思是他们选择不记录,而不是双重否定。 :-)
    • @Chris:哦,我意识到了。
    【解决方案2】:

    在 React 的 JSX 中,当组件有子组件时,只需要写&lt;MyComponent&gt;&lt;/MyComponent&gt;,像这样:

    <MyComponent>
        <Child />
        <Child />
        <Child />
    </MyComponent>
    

    如果&lt;MyComponent&gt;&lt;/MyComponent&gt; 之间没有任何内容,那么您可以写成&lt;MyComponent/&gt;&lt;MyComponent&gt;&lt;/MyComponent&gt;(但通常首选&lt;MyComponent/&gt;)。详情见Introducing JSX

    顺便说一句,您可以通过特殊的props.children 属性访问组件中的这些子项。更多内容请参见JSX in Depth: Children in JSX

    请注意,这与 HTML 或 XHTML 非常。这是具有不同规则的自己(相似)事物。例如,在 HTML 中,&lt;div/&gt;&lt;div&gt; 完全相同:一个 start 标签,你最终必须有一个结束标签。不是 JSX(或 XHTML)。 HTML 的规则是 void 元素(从不具有标记内容的元素,例如 brimg)可以在 &gt; 之前使用或不使用 / 编写,它们永远不会得到一个结束标签,但非空元​​素(如div)必须始终有一个结束标签(&lt;/div&gt;),它们不能自闭。在 JSX(和 XHTML)中,它们可以。

    【讨论】:

    • 感谢您的信息,我找到了 React Composition vs Inheritance,它还补充说多个 &lt;Child /&gt; 被作为 props.children 传递给 &lt;MyComponent&gt;&lt;/MyComponent&gt;
    猜你喜欢
    • 2018-08-19
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2018-07-31
    • 2016-02-20
    • 2014-07-29
    相关资源
    最近更新 更多