2026/6/11 13:58:23
网站建设
项目流程
xxx网站建设策划书范文,工厂管理软件哪个好,sem和网站建设的关系,化妆品网站素材JSX#xff08;JavaScript XML#xff09;是 React 生态中最具辨识度的特性之一#xff0c;它将类 HTML 的语法嵌入 JavaScript 中#xff0c;让开发者能够以直观的方式编写 UI 结构#xff0c;同时保留 JavaScript 的逻辑能力。很多开发者最初会将 JSX 误认为是 “HTML 在…JSXJavaScript XML是 React 生态中最具辨识度的特性之一它将类 HTML 的语法嵌入 JavaScript 中让开发者能够以直观的方式编写 UI 结构同时保留 JavaScript 的逻辑能力。很多开发者最初会将 JSX 误认为是 “HTML 在 JS 中的变体”但实际上它是 JavaScript 的语法糖最终会被编译为普通的 JavaScript 函数调用。本文将从本质、基础语法、进阶用法、常见误区四个维度全面解析 JSX 的使用方法帮助你彻底掌握这一核心技能。一、JSX 是什么—— 不止是 “HTMLJS”1. JSX 的本质语法糖JSX 是 Facebook 为 React 开发的一种语法扩展其核心作用是简化 React 元素的创建。当我们编写 JSX 代码时Babel或 TypeScript会将其编译为 React 的createElement函数调用React 17 也支持更简洁的jsx/jsxs函数。举个例子// 我们编写的JSX代码 const element h1 classNametitleHello, JSX!/h1;编译后的 JavaScript 代码React 17 之前const element React.createElement( h1, // 元素类型 { className: title }, // 元素属性 Hello, JSX! // 子元素 );React 17 的编译结果无需显式引入 Reactimport { jsx as _jsx } from react/jsx-runtime; const element _jsx(h1, { className: title, children: Hello, JSX! });从编译结果可以看出JSX 最终会被转换为描述 UI 的 JavaScript 对象React 元素而不是直接渲染为 DOM 节点。这也是 JSX 能够与 JavaScript 逻辑无缝结合的根本原因。2. 为什么要用 JSX在 JSX 出现之前开发者需要通过React.createElement手动创建 UI 元素代码冗长且可读性差。JSX 的出现解决了以下问题直观性类 HTML 的语法让 UI 结构一目了然比纯 JavaScript 代码更易读、易维护无缝集成逻辑可以在 JSX 中直接嵌入 JavaScript 表达式实现 UI 与业务逻辑的紧密结合编译时检查Babel 和 TypeScript 会在编译阶段检查 JSX 的语法错误提前规避运行时问题组件化支持JSX 天然支持 React 组件的嵌套和组合是 React 组件化思想的核心载体。注意JSX 并非 React 的强制要求你可以始终使用React.createElement编写代码但几乎所有 React 项目都会选择 JSX 以提升开发效率。二、JSX 的核心语法规则必掌握的基础JSX 虽然看起来像 HTML但本质是 JavaScript因此有一套自己的语法规则。以下是最核心的规则也是新手最容易踩坑的地方。1. 标签必须闭合与 HTML 不同JSX 要求所有标签必须显式闭合包括单标签如input、img。// 错误标签未闭合 const input input typetext; const img img srclogo.png; // 正确单标签使用自闭合语法 const input input typetext /; const img img srclogo.png altlogo /; // 双标签必须成对出现 const div divHello, JSX/div;2. 只能有一个根元素JSX 表达式中不能直接返回多个同级元素必须用一个根元素包裹或使用 Fragment 片段。// 错误多个根元素 const App () { return ( h1标题/h1 p内容/p ); }; // 正确用div作为根元素 const App () { return ( div h1标题/h1 p内容/p /div ); };3. 类名使用className而非class在 JavaScript 中class是关键字因此 JSX 中不能使用class属性定义 CSS 类名而是使用className对应 DOM 的className属性。// 错误使用class关键字 const element div classcontainerHello/div; // 正确使用className const element div classNamecontainerHello/div;补充在 React Native 中类名使用style属性而不是className。4. 表单标签的for属性改为htmlFor同理for是 JavaScript 的关键字JSX 中使用htmlFor替代label标签的for属性。// 错误使用for关键字 const label label forusername用户名/label; // 正确使用htmlFor const label label htmlForusername用户名/label; input idusername typetext /;5. 内联样式是对象形式JSX 中的内联样式不能直接写 CSS 字符串而是需要传递一个样式对象属性名采用驼峰命名法如fontSize而非font-size。// 错误CSS字符串形式 const element div stylefont-size: 16px; color: red;Hello/div; // 正确样式对象形式 const element div style{{ fontSize: 16px, color: red }}Hello/div; // 推荐将样式抽离为变量 const textStyle { fontSize: 16px, color: red, marginTop: 10px // 驼峰命名法 }; const element div style{textStyle}Hello/div;6. 插入 JavaScript 表达式使用{}这是 JSX 最强大的特性之一可以通过大括号{}在 JSX 中嵌入任意有效的 JavaScript 表达式注意是表达式不是语句。// 1. 变量 const name React; const element h1Hello, {name}!/h1; // 2. 算术运算 const a 10; const b 20; const element p10 20 {a b}/p; // 3. 函数调用 const getGreeting (name) Hello, ${name}!; const element h1{getGreeting(JSX)}/h1; // 4. 三元运算符条件表达式 const isLogin true; const element p{isLogin ? 已登录 : 请登录}/p; // 5. 数组会自动展开 const list [苹果, 香蕉, 橙子]; const element div{list}/div; // 渲染为div苹果香蕉橙子/div注意{}中只能放表达式有返回值的代码不能放语句如 if、for、switch 等。如果需要使用语句需在 JSX 外部处理。7. JSX 中的注释JSX 中的注释需要写在{}内格式为/* 注释内容 */单行注释也可以用//但需要注意换行。const element ( div {/* 这是JSX中的多行注释 */} h1Hello, JSX!/h1 {/* 单行注释也可以这样写 */} {/* 多行注释 可以换行 */} p{/* 行内注释 */}这是内容/p /div ); // 单行注释的另一种写法注意换行 const element ( div {/* 推荐 */} h1Hello, JSX!/h1 // 这种写法会报错因为//不在{}内 p{// 这种写法可行但需要换行 内容}/p /div );三、JSX 的进阶用法从基础到实战掌握了基础语法后我们来看看 JSX 在实际开发中的高频进阶用法。1. 片段Fragment避免多余的根节点前面提到 JSX 必须有一个根元素但有时我们不想添加额外的div等节点避免 DOM 层级过深此时可以使用React Fragment片段它会在渲染时被忽略只保留子元素。用法 1React.Fragmentimport React from react; const App () { return ( React.Fragment h1标题/h1 p内容/p button按钮/button /React.Fragment ); };用法 2空标签 /简写形式这是 React 16.2 支持的简写语法功能与React.Fragment一致但不支持添加属性如 key。const App () { return ( h1标题/h1 p内容/p button按钮/button / ); };用法 3带 key 的 Fragment仅支持完整写法当在列表中渲染 Fragment 时需要为其添加 key 属性此时必须使用完整的React.Fragment。const list [ { id: 1, text: 第一项 }, { id: 2, text: 第二项 } ]; const App () { return ( div {list.map(item ( React.Fragment key{item.id} p{item.text}/p hr / /React.Fragment ))} /div ); };2. 列表渲染使用map并添加key在 JSX 中渲染列表如数组时通常使用Array.prototype.map方法且必须为每个列表项添加唯一的key属性。const todos [ { id: 1, text: 学习JSX }, { id: 2, text: 学习React }, { id: 3, text: 开发项目 } ]; const TodoList () { return ( ul {todos.map(todo ( // 正确使用唯一的id作为key li key{todo.id}{todo.text}/li ))} /ul ); };关于key的重要注意事项key的作用帮助 React 识别列表中元素的变化添加、删除、排序从而优化渲染性能key必须是唯一的在同一列表中每个元素的 key 不能重复不要使用索引作为 key如果列表的顺序发生变化如排序、删除索引会重新分配导致 React 误判元素变化引发性能问题或渲染错误key只在列表内部有效key 是给 React 看的不会传递给组件因此不能在组件内部通过props.key获取。3. 条件渲染多种实现方式在 JSX 中实现条件渲染有多种方式可根据场景选择方式 1三元运算符适合简单条件const isLogin true; const UserInfo () { return ( div {isLogin ? ( p欢迎回来用户/p ) : ( button请登录/button )} /div ); };方式 2逻辑与运算符适合 “存在即渲染” 的场景const hasUnreadMsg true; const unreadCount 5; const MsgTip () { return ( div {/* 当hasUnreadMsg为true时渲染后面的元素为false时返回false不渲染 */} {hasUnreadMsg span classNamebadge{unreadCount}/span} /div ); };方式 3外部条件语句适合复杂条件const UserRole ({ role }) { // 外部定义渲染逻辑 let content; if (role admin) { content p管理员/p; } else if (role user) { content p普通用户/p; } else { content p游客/p; } return div{content}/div; };方式 4组件提取适合极复杂的条件将不同条件的渲染逻辑提取为独立组件让代码更清晰。const AdminPanel () p管理员面板/p; const UserPanel () p用户面板/p; const GuestPanel () p游客面板/p; const Panel ({ role }) { switch (role) { case admin: return AdminPanel /; case user: return UserPanel /; default: return GuestPanel /; } };4. 自定义组件的渲染首字母大写在 JSX 中渲染自定义 React 组件时组件名必须以大写字母开头这是 React 的约定用于区分原生 HTML 标签。// 正确组件名首字母大写 const Button () button自定义按钮/button; const App () { return ( div Button / {/* 渲染自定义组件 */} button原生按钮/button {/* 渲染原生HTML标签 */} /div ); }; // 错误组件名小写React会将其视为原生HTML标签不存在的标签会渲染为div或报错 const button () button自定义按钮/button; const App () { return button /; // 渲染原生button而非自定义组件 };5. 属性传递Props向组件传递数据可以通过 JSX 的属性props向自定义组件传递数据属性名同样采用驼峰命名法如onClick、dataId。// 子组件接收props const Greeting (props) { return h1Hello, {props.name}!/h1; }; // 父组件传递props const App () { return ( div {/* 传递字符串属性 */} Greeting nameReact / {/* 传递非字符串属性需用{}包裹 */} Greeting name{123} / {/* 传递布尔值 */} Greeting isShow{true} / {/* 传递函数 */} Greeting onButtonClick{() alert(点击了)} / {/* 传递JSX元素子元素对应props.children */} Greeting p这是子元素/p /Greeting /div ); };补充props.children是一个特殊的 props用于接收组件的子元素如上面的p这是子元素/p。6. 危险的 HTML 渲染dangerouslySetInnerHTML默认情况下React 会转义 JSX 中的所有内容防止 XSS 攻击跨站脚本攻击。但有时我们需要渲染原始的 HTML 字符串如后端返回的富文本此时可以使用dangerouslySetInnerHTML属性注意使用该属性存在安全风险需确保内容是可信的。// 原始HTML字符串 const htmlContent p stylecolor: red;这是富文本内容/p; // 错误React会转义HTML标签渲染为纯文本 const element div{htmlContent}/div; // 正确使用dangerouslySetInnerHTML渲染原始HTML const element div dangerouslySetInnerHTML{{ __html: htmlContent }} /;警告不要将用户输入的内容直接通过 dangerouslySetInnerHTML 渲染否则可能导致 XSS 攻击。如果必须渲染用户输入需先进行 HTML 转义或过滤。7. JSX 作为变量、返回值和参数由于 JSX 最终会被编译为 JavaScript 对象因此它可以作为变量存储、作为函数返回值、作为参数传递给函数。// 1. 作为变量 const header h1Hello, JSX/h1; // 2. 作为函数返回值 const getHeader () { return h1Hello, JSX/h1; }; // 3. 作为参数传递 const renderElement (element) { return div{element}/div; }; const App () { return renderElement(header); };四、JSX 的常见误区与避坑指南即使是有经验的开发者也可能在使用 JSX 时踩坑。以下是最常见的误区及解决方案误区 1混淆 HTML 和 JSX 的语法差异问题使用class、for、style等 HTML 属性导致语法错误或样式不生效。解决方案牢记 JSX 的属性替换规则class→classNamefor→htmlForstyle→ 驼峰命名的样式对象自定义属性使用data-*前缀如data-idReact 会保留这些属性。误区 2在{}中使用语句而非表达式问题在 JSX 的{}中写入 if、for、switch 等语句导致编译错误。jsx// 错误if是语句不能放在{}内 const element div{if (true) { return Hello }}/div;解决方案将语句移到 JSX 外部或使用三元运算符、逻辑与等表达式替代。误区 3列表渲染忘记加key或使用索引作为key问题列表渲染时未添加key控制台出现警告或使用索引作为key导致列表排序 / 删除时渲染异常。解决方案使用唯一的 ID如后端返回的 id、UUID作为key如果确实没有唯一 ID可考虑生成唯一标识如item.name item.index但尽量避免使用索引。误区 4过度使用dangerouslySetInnerHTML问题随意使用dangerouslySetInnerHTML渲染不可信内容导致 XSS 攻击风险。解决方案尽量避免使用dangerouslySetInnerHTML如果必须使用确保内容是可信的如后端自己生成的富文本对用户输入的内容进行 HTML 转义如使用he库。误区 5忽略 JSX 的大小写敏感问题将原生 HTML 标签大写如Div或自定义组件小写如button导致渲染错误。解决方案原生 HTML 标签全小写如div、button自定义组件首字母大写如Button、TodoList。误区 6直接修改props或state后渲染 JSX问题修改props或state的原始值如数组的push、对象的属性赋值导致 React 无法检测到变化JSX 不更新。解决方案遵循 React 的不可变原则创建新的数组 / 对象如使用concat、map、spread运算符。五、JSX 的优势为什么它能成为 React 的标配总结一下JSX 之所以能成为 React 开发的核心工具主要有以下优势直观性类 HTML 的语法让 UI 结构与代码逻辑分离但又紧密结合比纯 JavaScript 更易读灵活性可以嵌入任意 JavaScript 表达式实现复杂的逻辑渲染安全性默认转义内容防止 XSS 攻击组件化天然支持 React 的组件化思想便于复用和维护跨平台不仅可以用于 Web 端的 DOM 渲染还可以用于 React Native 的原生组件渲染语法一致底层渲染不同工具支持Babel、TypeScript、ESLint 等工具对 JSX 有完善的支持提升开发效率。六、总结JSX 是 React 开发的基础它不是 HTML也不是新的编程语言而是 JavaScript 的语法糖。掌握 JSX 的核心语法规则如标签闭合、className、表达式插入、进阶用法如 Fragment、列表渲染、条件渲染和避坑指南是编写高效、可维护的 React 代码的关键。值得一提的是JSX 并非 React 的专属特性Vue 3 也支持 JSX 语法甚至一些其他前端框架也开始兼容 JSX。因此学好 JSX 不仅能提升 React 开发能力也是前端工程师的通用技能。最后记住JSX 的本质是 JavaScript所有 JavaScript 的特性都可以与 JSX 结合使用。不要被类 HTML 的语法迷惑始终以 JavaScript 的思维来编写 JSX。