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

【react从入门到精通】React JSX详解

文章目录

  • 前言
  • React技能树
  • 什么是JSX
  • JSX的基本语法规则
    • 1.JSX必须有一个顶层元素
    • 2.JSX标签必须有一个结束标记,或者是自闭合的
    • 3.JSX中可以使用JavaScript表达式
    • 4.JSX中的样式和HTML中的样式有所不同
    • 5.JSX中的class属性必须写成className
    • 6.JSX中的style属性必须使用对象来表示
  • 总结
  • 写在最后

在这里插入图片描述

前言

在上一篇文章《React生命周期》中我们了解了React的生命周期,深入分析了React每个生命周期的意义。了解了利用生命周期中的函数能够帮助我们实现什么样的功能以及为什么要这么做。有了以上的只是基础我们对React的理解又更近一步。更够写出更加健壮完善的代码。

本文中我们将详细了解React中的JSX,以及需要注意的一些语法规则。

React技能树

React 技能树
├── JSX
│   ├── 语法
│   ├── 元素渲染
│   ├── 组件
│   ├── Props
│   ├── State
│   └── 生命周期
├── 组件通信
│   ├── 父子组件通信
│   ├── 兄弟组件通信
│   ├── 跨级组件通信
│   ├── Context
│   └── Redux
├── 样式
│   ├── 内联样式
│   ├── CSS Modules
│   └── Styled Components
├── 路由
│   ├── React Router
│   ├── 动态路由
│   └── 嵌套路由
├── 数据请求
│   ├── Axios
│   ├── Fetch
│   └── GraphQL
├── 状态管理
│   ├── Redux
│   ├── MobX
│   └── Recoil
├── 常用库和框架
│   ├── Ant Design
│   ├── Material UI
│   ├── Bootstrap
│   ├── Semantic UI
│   └── Tailwind CSS
├── 测试
│   ├── Jest
│   ├── Enzyme
│   └── React Testing Library
├── 构建工具
│   ├── Webpack
│   └── Parcel
└── 服务端渲染
    ├── Next.js
    └── Gatsby

什么是JSX

JSX是一种语法扩展,它将HTML和JavaScript代码结合起来,使得我们能够在JavaScript代码中编写类似HTML的标记。在React中,我们可以使用JSX来描述组件的结构和样式,它提供了一种简洁、清晰的方式来表达我们的意图。

在React中,JSX被编译为普通的JavaScript函数调用,所以我们可以在JavaScript中使用它。具体来说,JSX被编译为React.createElement函数的调用,该函数接受三个参数:要创建的元素类型、元素的属性和子元素。

下面是一个简单的JSX示例:

const element = <h1>Hello, world!</h1>;

在这个例子中,我们定义了一个名为element的变量,它的值是一个JSX元素,代表一个h1标签,包含文本"Hello, world!"。下面是相应的JavaScript代码:

const element = React.createElement(
  'h1',
  null,
  'Hello, world!'
);

在这个例子中,我们使用React.createElement函数创建了一个名为element的变量,它的值与JSX示例的值相同。第一个参数是元素类型,这里是’h1’字符串;第二个参数是元素的属性,这里是null;第三个参数是子元素,这里是字符串’Hello, world!'。

JSX的基本语法规则

1.JSX必须有一个顶层元素

在JSX中,我们必须将所有的标签包裹在一个顶层元素中。如果有多个顶层元素,我们需要使用一个容器元素将它们包裹起来。例如:

const element = (
  <div>
    <h1>Hello, world!</h1>
    <p>Welcome to my website.</p>
  </div>
);

在这个例子中,我们将h1和p标签包裹在一个div标签中,以便它们成为顶层元素。

2.JSX标签必须有一个结束标记,或者是自闭合的

在JSX中,所有的标签都必须有一个结束标记,或者是自闭合的。例如:

// 有结束标记的标签
<h1>Hello, world!</h1>

// 自闭合的标签
<img src="image.jpg" alt="example" />

3.JSX中可以使用JavaScript表达式

在JSX中,我们可以在标记中使用JavaScript表达式,用花括号{}包裹。例如:

const name = 'React';
const element = <h1>Hello, {name}!</h1>;

在这个例子中,我们定义了一个名为name的变量,它的值是字符串’React’。我们在h1标签中使用了一个JavaScript表达式{name},它将被替换为变量name的值。

4.JSX中的样式和HTML中的样式有所不同

在HTML中,我们可以直接在元素上使用style属性,并在属性值中使用CSS语法来描述样式,例如:

<div style="color: red; font-size: 24px;">Hello, world!</div>

而在JSX中,我们也可以使用style属性来指定元素的样式,但是属性值必须使用JavaScript对象来表示。例如:

const style = {
  color: 'red',
  fontSize: '24px',
};
const element = <div style={style}>Hello, world!</div>;

可以看到,我们首先定义了一个名为style的JavaScript对象,它包含了color和fontSize两个属性,并分别指定了它们的值为’red’和’24px’。然后,我们在JSX中使用style属性,并将style对象作为属性值传递给div元素。

需要注意的是,JSX中的style属性与HTML中的style属性语法有所不同,我们必须使用JavaScript对象来表示样式,并使用驼峰式命名法来表示CSS属性名。例如,CSS中的属性background-color在JavaScript对象中表示为backgroundColor。

5.JSX中的class属性必须写成className

在JSX中,我们使用className属性来指定元素的class,而不是使用HTML中的class属性。例如:

const element = <div className="container">Hello, world!</div>;

在这个例子中,我们使用了className属性来指定div元素的class为’container’。

6.JSX中的style属性必须使用对象来表示

在JSX中,我们使用style属性来指定元素的样式,而不是使用HTML中的style属性。但是,与HTML中不同的是,在JSX中,我们需要使用一个JavaScript对象来表示样式。例如:

const style = {
  color: 'red',
  fontSize: '24px',
};
const element = <div style={style}>Hello, world!</div>;

在这个例子中,我们定义了一个名为style的变量,它的值是一个包含color和fontSize属性的对象。我们使用style属性来指定div元素的样式为这个对象。

JSX中的注释与HTML中的注释有所不同。
在JSX中,我们使用花括号和注释符号/* */来表示注释,而不是使用HTML中的 。例如:

const element = (
  <div>
    {/* 这是一个注释 */}
    <h1>Hello, world!</h1>
  </div>
);

在这个例子中,我们在JSX中使用注释符号/* */来表示注释,它们将被编译为JavaScript中的注释。

总结

在React中,JSX提供了一种简洁、清晰的方式来描述组件的结构和样式。它结合了HTML和JavaScript代码,使得我们能够在JavaScript代码中编写类似HTML的标记。

在使用JSX时,需要注意一些语法规则,例如必须有一个顶层元素、标签必须有结束标记或自闭合、样式必须使用对象来表示等。掌握JSX的使用方法对于开发React应用非常重要。

写在最后

✨原创不易,希望各位大佬多多支持。

👍点赞,你的认可是我创作的动力。

⭐️收藏,感谢你对本文的喜欢。

✏️评论,你的反馈是我进步的财富。


http://www.kler.cn/a/16737.html

相关文章:

  • Axure设计之文本编辑器制作教程
  • 【大数据测试HBase数据库 — 详细教程(含实例与监控调优)】
  • 2024-11-13 学习人工智能的Day26 sklearn(2)
  • win32 / WTL 开发多线程应用,子线程传递大对象给UI线程(主窗口)的方法
  • uniapp+vue2 设置全局变量和全局方法 (兼容h5/微信小程序)
  • 【再谈设计模式】抽象工厂模式~对象创建的统筹者
  • pytorch学习率设置——optimizer.param_groups、对不同层设置学习率、动态调整学习率。
  • Java中几种常量池面试总结
  • OVS常用命令与使用总结
  • Python_PyStray结合Tkinter显示系统托盘图标
  • SpringMVC与SpringWebFlux
  • 【Spring Security】| 从0到1编写一个权限认证 | 学会了吗?
  • MEET开发者 | 选择和努力一样重要,专访杭州三汇测试工程师齐雪莲
  • c++标准模板(STL)(std::array)(三)
  • 高程实验8队列
  • ROS Noetic版本 rosdep找不到命令 不能使用的解决方法
  • 剑指 Offer 51. 数组中的逆序对
  • 计算机视觉 | 人工智能 自己总结 (下)
  • 数据库之事务隔离级别详解
  • 08.watchEffect.上
  • CTF权威指南 笔记 -第二章二进制文件-2.1-汇编原理
  • r语言tidyverse教程:3数据重塑tidyr
  • Baumer工业相机堡盟相机如何使用偏振功能(偏振相机优点和行业应用)(C#)
  • MySQL数据库中,在读已提交和可重复读这两个不同事务隔离级别下幻读的区别
  • 来CSDN两年了,一些小感想
  • 第十八章 协程