React <> </>的用法

React <> </>的用法

介绍

在 React 中,使用 <> 表示一个空标签或片段(Fragment),这是一个简洁的方式来包裹一组子元素而不在 DOM 树中添加额外的节点。空标签在 JSX 语法中是一种简写形式,相当于 React.Fragment。它的主要作用是允许你在不引入额外 DOM 元素的情况下返回多个子元素。

为什么使用 <>?

  • 减少不必要的 DOM 元素 :如果你只是想包裹一组元素而不希望在 DOM 树中添加额外的
    或 标签,可以使用片段。
  • 提高可读性:它使得 JSX 结构更清晰,避免了嵌套过多的容器元素。
  • 保持语义:有时候,添加额外的元素会影响 HTML 的语义结构,而片段不会引入任何实际的 HTML 标签,从而保持页面的语义性。

例子

在你的代码中,使用了一个片段来包裹多行 JSX:

typescript 复制代码
return (
  <>
    <>GUI v{gui_version}</>
    {Object.entries(server_version ?? {}).map(([key, value]) => (
      <span key={key}>
        <Divider type="vertical" />
        {key}
        &nbsp;
        {value}
      </span>
    ))}
    
    <Tabs
      type={'editable-card'}
      onChange={onChange}
      activeKey={activeTab}
      onEdit={onEdit}
      items={tabs.map(({ label, tab_id }) => ({
        label,
        key: tab_id,
        children: <SimulationContainer key={tab_id} tab_id={tab_id} />
      }))}
      tabBarExtraContent={{
        right: (
          <Space size="small">
            <Dropdown menu={{ items }} placement="bottomRight">
              <Button size="small">
                <SettingOutlined />
              </Button>
            </Dropdown>
          </Space>
        )
      }}
    />
  </>
)

解释

最外层的 <>...</>:

这是一个片段,包裹了整个返回内容,使得可以在不引入额外 DOM 元素的情况下返回多个顶级元素。

内层的 <>GUI v{gui_version}</>:

这是一个片段,包裹了 GUI v{gui_version} 文本。这在这种情况下其实没有必要,因为文本本身就是一个单独的元素,可以直接返回,不需要片段包裹。不过,这样写不会有任何副作用,只是多余了。

优化建议

如果内层的片段没有特殊用途,可以直接移除它,简化代码:

typescript 复制代码
return (
  <>
    GUI v{gui_version}
    {Object.entries(server_version ?? {}).map(([key, value]) => (
      <span key={key}>
        <Divider type="vertical" />
        {key}
        &nbsp;
        {value}
      </span>
    ))}
    
    <Tabs
      type={'editable-card'}
      onChange={onChange}
      activeKey={activeTab}
      onEdit={onEdit}
      items={tabs.map(({ label, tab_id }) => ({
        label,
        key: tab_id,
        children: <SimulationContainer key={tab_id} tab_id={tab_id} />
      }))}
      tabBarExtraContent={{
        right: (
          <Space size="small">
            <Dropdown menu={{ items }} placement="bottomRight">
              <Button size="small">
                <SettingOutlined />
              </Button>
            </Dropdown>
          </Space>
        )
      }}
    />
  </>
)

这样更简洁和直观。

关于顶级元素

假设你有一个 App 组件,它引用了你定义的 SimulationTabs 组件:

js 复制代码
import React from 'react';
import SimulationTabs from './SimulationTabs';

function App() {
  return (
    <div className="App">
      <h1>Welcome to the Simulation App</h1>
      <SimulationTabs />
    </div>
  );
}

export default App;

在这个例子中,SimulationTabs 组件会在 DOM 树中直接插入到
内部:

js 复制代码
<div class="App">
  <h1>Welcome to the Simulation App</h1>
  <!-- SimulationTabs component content will be here -->
</div>

SimulationTabs 组件的渲染内容

假设 SimulationTabs 组件返回的 JSX 如下:

js 复制代码
return (
  <>
    GUI v{gui_version}
    {Object.entries(server_version ?? {}).map(([key, value]) => (
      <span key={key}>
        <Divider type="vertical" />
        {key}
        &nbsp;
        {value}
      </span>
    ))}
    <Tabs
      type={'editable-card'}
      onChange={onChange}
      activeKey={activeTab}
      onEdit={onEdit}
      items={tabs.map(({ label, tab_id }) => ({
        label,
        key: tab_id,
        children: <SimulationContainer key={tab_id} tab_id={tab_id} />
      }))}
      tabBarExtraContent={{
        right: (
          <Space size="small">
            <Dropdown menu={{ items }} placement="bottomRight">
              <Button size="small">
                <SettingOutlined />
              </Button>
            </Dropdown>
          </Space>
        )
      }}
    />
  </>
);

当 SimulationTabs 组件被渲染时,它的内容会替代 App 组件中引用 的位置。渲染后的 DOM 结构如下:`

js 复制代码
<div class="App">
  <h1>Welcome to the Simulation App</h1>
  GUI v1.0.0
  <span>
    <span class="ant-divider ant-divider-vertical"></span>
    backend &nbsp; 1.0.0
  </span>
  <span>
    <span class="ant-divider ant-divider-vertical"></span>
    frontend &nbsp; 2.1.0
  </span>
  <div class="ant-tabs ant-tabs-editable-card">
    <!-- Content of Tabs component -->
    <button class="ant-btn ant-btn-sm">
      <span class="anticon anticon-setting">
        <svg>...</svg>
      </span>
    </button>
  </div>
</div>

总结

顶级元素:React 组件必须返回一个单一的顶级元素 ,可以是一个实际的 HTML 元素(如 div、span)或一个 React.Fragment(用 <>...</> 简写)。

组件引用:当一个组件在另一个组件中被引用时,它的渲染内容会直接插入到引用点所在的 DOM 结构中。

保持结构清晰:使用 React.Fragment 可以避免在 DOM 中引入不必要的包裹元素,从而保持 HTML 结构清晰和语义正确。

相关推荐
别拿曾经看以后~1 小时前
【el-form】记一例好用的el-input输入框回车调接口和el-button按钮防重点击
javascript·vue.js·elementui
川石课堂软件测试1 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
JerryXZR1 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
problc1 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
Gavin_9151 小时前
【JavaScript】模块化开发
前端·javascript·vue.js
懒大王爱吃狼2 小时前
Python教程:python枚举类定义和使用
开发语言·前端·javascript·python·python基础·python编程·python书籍
小牛itbull3 小时前
ReactPress:重塑内容管理的未来
react.js·github·reactpress
待磨的钝刨4 小时前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
前端青山8 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
从兄10 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript