当前位置: 首页 > news >正文

JSX 详解:React 的核心语法

JSX 详解:React 的核心语法

JSX (JavaScript XML) 是 React 的核心语法扩展,它允许你在 JavaScript 代码中编写类似 HTML 的标记。以下是关于 JSX 的全面解析:

一、JSX 的本质

  1. ​不是字符串也不是 HTML​​:

    • JSX 是 JavaScript 的语法扩展
    • 最终会被编译为普通的 JavaScript 函数调用(React.createElement()
  2. ​编译过程示例​​:

    // JSX 写法
    const element = <h1 className="title">Hello, world!</h1>;// 编译后的 JavaScript
    const element = React.createElement('h1',{ className: 'title' },'Hello, world!'
    );

二、JSX 的核心特性

1. 嵌入表达式

const name = 'Alice';
const element = <h1>Hello, {name}</h1>;  // 使用大括号嵌入变量

2. 属性设置

// 常规属性
const element = <div className="container"></div>;// 动态属性
const isActive = true;
const button = <button disabled={!isActive}>Click</button>;

3. 特殊属性名

  • class → className (因为 class 是 JavaScript 保留字)
  • for → htmlFor
  • tabindex → tabIndex

三、JSX 的进阶用法

1. 多行 JSX

const element = (<div><h1>标题</h1><p>段落内容</p></div>
);

2. 条件渲染

{isLoggedIn ? (<LogoutButton />
) : (<LoginButton />
)}

3. 列表渲染

const numbers = [1, 2, 3];
const listItems = numbers.map((number) => <li key={number.toString()}>{number}</li>
);

4. 子元素

// 包含子元素
const element = (<div><h1>标题</h1>{children}</div>
);// 自闭合标签
const img = <img src={user.avatarUrl} />;

四、JSX 的底层原理

  1. ​Babel 转换​​:

    • JSX 通过 Babel 的 @babel/plugin-transform-react-jsx 插件转换
    • 可以配置使用不同的运行时(如 React 17+ 的新 JSX 转换)
  2. ​React 17+ 的新 JSX 转换​​:

    // 不再需要引入 React
    function App() {return <h1>Hello World</h1>;
    }

五、为什么使用 JSX

  1. ​优势​​:

    • 更直观的 UI 表达方式
    • 视觉上更接近最终渲染结果
    • 提供编译时错误检查
    • 防止注入攻击(XSS)
  2. ​对比模板语法​​:

    • 不同于 Vue/Angular 的模板语法
    • 完全利用 JavaScript 的表达能力
    • 不需要学习额外的模板语法

六、常见问题

1. 必须闭合标签

// 错误
const img = <img src="...">// 正确
const img = <img src="..." />;

2. 返回单个根元素

// 错误
return (<h1>标题</h1><p>内容</p>
);// 正确:使用 Fragment 或 div 包裹
return (<><h1>标题</h1><p>内容</p></>
);

JSX 是 React 开发的核心技能,熟练掌握它能够极大提高 React 开发效率和代码可读性。

相关文章:

  • 用idea操作git缓存区回退、本地库回退、远程库回退
  • python爬虫关于多进程,多线程,协程的使用
  • 20.jsBridge多页面交互与原生事件监听冲突问题
  • 04、eigen库实现插值算法与matlab对比
  • C#核心学习
  • 构建智能问答系统:从零开始实现 RAG 应用
  • LangChain 结构化输出指南
  • 跟着AI学习C# Day20
  • WebWorker:提升前端性能的多线程利器
  • 国产ARM/RISCV与OpenHarmony物联网项目(三)网关设备控制
  • Linux系统移植⑨:uboot启动流程详解-bootz启动Linux过程
  • 权重遍历及Delong‘s test | 已完成单调性检验?
  • shelve模块的使用
  • Linux操作系统网络服务模块一DHCP服务概述
  • 如何在Redis中实现缓存功能
  • Python运算符及分支结构全解析
  • 开源 Arkts 鸿蒙应用 开发(四)布局和常用控件
  • python中学物理实验模拟:杠杆平衡条件
  • Matlab 角点探测
  • [Python][Flask][Gunicorn] 搭建一个服务器-初步-小白式教程 - 1
  • 长沙公司网站开发/百度公司地址
  • 成都做营销型网站/南宁今日头条最新消息
  • 东软实训网站开发/免费的网站申请
  • 用手机免费制作app软件有哪些/快速排名优化推广价格
  • 杭州建设局官网/谷歌seo 外贸建站
  • 郑州做景区网站建设公司/新闻联播今日新闻