React 07

1 条件渲染支持三目运算符

【两个例子完全一样吗?】

1. 面向对象开发的 "实例" 认知

在传统面向对象开发中(比如使用 Vue 或原生 DOM 操作),我们创建的 UI 元素(如 <li>)是真实的对象实例,它们有自己的内部状态(比如输入框的内容、组件的私有数据),也是真实 DOM 节点的映射。

如果用面向对象的思维去看类似的 UI 逻辑,会觉得 "不同分支创建不同的 <li> 实例" 是有差异的 ------ 因为实例的身份、状态可能隐含区别。

2. JSX 的本质:"描述性图纸"

JSX 元素不是真实的对象实例,它更像是一张 "设计图纸":

  • 它没有内部状态,也不是真实的 DOM 节点,只是用来描述 UI 结构的简单对象(包含标签名、属性、子元素等信息)。
  • 当 React 渲染时,会根据这张 "图纸" 去创建或更新真实 DOM,但 JSX 本身只是 "描述",而非 "实例"。

3. 为什么两个例子完全相同?

回到文中的两个例子(不管是用 if-else 还是三目运算符),它们最终生成的 JSX 描述是完全一致的 ------ 对于相同的逻辑(isPacked 为真时显示带对勾的内容,否则显示普通内容),最终产出的 "UI 图纸" 没有任何区别。

React 只关心这张 "图纸" 的结构,而不关心你是用哪种语法生成的它。因此,从 JSX 的本质和 React 的渲染逻辑来看,这两个例子在功能和最终效果上完全相同

延伸:"状态的保持和重置" 的关联

文中提到的 "状态的保持和重置",核心是 React 对组件状态的管理逻辑。

因为 JSX 只是 "图纸",React 会根据 "图纸" 的变化来决定是否保留或重置组件的内部状态 ------ 这进一步印证了 JSX 本身不承载状态,只是描述 UI 的特性。

【jsx本质还是一个html骨架吗?】

不!

这种理解不够准确,JSX 本质上是JavaScript 的语法扩展,并非单纯的 HTML 骨架,我们可以从以下几个维度详细分析:

维度 具体说明
语法本质 JSX 是 JavaScript 代码的一种 "语法糖",最终会被编译成 React.createElement() 这样的 JavaScript 函数调用,用来创建描述 UI 结构的对象(React 元素)。比如 <div>Hello</div> 会被编译为 React.createElement('div', null, 'Hello')
与 HTML 的区别 虽然看起来像 HTML,但存在诸多差异。比如 class 要写成 className、for 要写成 htmlFor;可以在其中嵌入 JavaScript 表达式(用 {} 包裹),如 <div>{2 + 3}</div> 会渲染出 5;还支持条件渲染、列表渲染等逻辑,这些都是 HTML 不具备的。
功能定位 它的作用是描述 UI 应该是什么样子,是一种 "声明式" 的 UI 描述方式。React 会根据这些描述来构建和更新真实的 DOM 树,它是连接 JavaScript 逻辑和最终 UI 呈现的桥梁,而非单纯的 HTML 结构。

2 条件渲染摘要

1. 用 JavaScript 控制 React 分支逻辑

React 是基于 JavaScript 构建的,所以可以直接在组件中使用 JavaScript 的逻辑语法(如 iffor、三元运算符等)来控制 JSX 的渲染分支,让 UI 能根据不同条件呈现不同内容。

2. 用if语句选择性返回 JSX 表达式

示例:

javascript 复制代码
function MyComponent({ isShow }) {
  if (isShow) {
    return <div>显示的内容</div>;
  }
  return <div>隐藏时的内容</div>;
}

通过 if 语句判断条件,选择性地返回不同的 JSX 结构,实现分支渲染。

3. 把 JSX 赋值给变量后嵌入其他 JSX

示例:

javascript 复制代码
function MyComponent({ isSpecial }) {
  let content;
  if (isSpecial) {
    content = <span>特殊内容</span>;
  } else {
    content = <span>普通内容</span>;
  }
  return <div>容器内容 {content}</div>;
}

将 JSX 先赋值给变量,再通过大括号 {} 嵌入到其他 JSX 中,让代码结构更清晰,便于复杂逻辑的管理。

4. 三元运算符{cond ? <A /> : <B />}

这是紧凑的条件渲染语法,意思是 "当 condtrue 时渲染 <A />,否则渲染 <B />"。示例:

javascript 复制代码
function MyComponent({ isDone }) {
  return <div>{isDone ? <span>已完成</span> : <span>未完成</span>}</div>;
}

5. 逻辑与{cond && <A />}

表示 "当 condtrue 时渲染 <A />,否则不渲染任何内容"。常用于只需单分支渲染的场景。示例:

javascript 复制代码
function MyComponent({ hasTip }) {
  return <div>{hasTip && <span>提示信息</span>}</div>;
}

hasTipfalse 时,不会渲染 <span>,相当于 "隐藏" 该元素。

6. 语法选择的灵活性

虽然三元运算符、逻辑与这些快捷表达式在 React 开发中很常见,但如果你觉得if语句更易读、更符合自己的编码习惯,完全可以选择用if来实现分支逻辑,React 对这几种方式没有优劣限制,以代码可读性和维护性为准即可。

3 字符串需要用引号(单引号或双引号)来标识

emoji也是。

emoji 用引号包裹是因为在 JavaScript(包括 JSX 中的 JavaScript 表达式)里,字符串需要用引号(单引号或双引号)来标识

isPacked ? '✅' : '❌' 是一个 JavaScript 三元表达式,其中 '✅''❌' 是字符串字面量。JSX 是 JavaScript 的语法扩展,里面的大括号 {} 会执行 JavaScript 逻辑,所以这里必须遵循 JavaScript 对字符串的语法规则,用引号把 emoji 包裹起来,这样解释器才能正确识别它们是字符串类型,从而在渲染时输出对应的 emoji 符号。

相关推荐
AiXed16 分钟前
PC微信协议之AES-192-GCM算法
前端·数据库·python
月下倩影时16 分钟前
视觉进阶篇——机器学习训练过程(手写数字识别,量大管饱需要耐心)
人工智能·学习·机器学习
AllData公司负责人18 分钟前
实时开发平台(Streampark)--Flink SQL功能演示
大数据·前端·架构·flink·开源
小满zs41 分钟前
Next.js第五章(动态路由)
前端
清沫1 小时前
VSCode debugger 调试指南
前端·javascript·visual studio code
一颗宁檬不酸1 小时前
页面布局练习
前端·html·页面布局
zhenryx2 小时前
React Native 自定义 ScrollView 滚动条:开箱即用的 IndicatorScrollView(附源码示例)
javascript·react native·react.js·typescript
金木讲编程3 小时前
Claude、Agent与Copilot协作生成Angular应用
前端·ai编程
MasterLi80233 小时前
我的读书清单
android·linux·学习
hssfscv3 小时前
JAVA学习笔记——集合的概念和习题
笔记·学习