【React】JSX语法

目录

  • 一、前言
  • 二、JSX介绍
  • 三、JSX原理
    • 1、DOM结构示例
    • 2、HTML的JSX结构示例
    • 3、编译之后的代码
  • 四、为什么使用JSX
    • 1、JSX的特点
    • 2、JSX的书写规范
  • 五、JSX的使用
    • 1、嵌入JS表达式
    • 2、条件渲染
    • 3、列表渲染
      • ①、arr.map()
  • 六、组件
    • 1、类组件
      • ①、实例化组件
    • 2、函数组件
    • 3、组件样式
      • ①、行内样式
      • ②、使用class
  • 七、总结

一、前言

此博文将讲解一个有趣的标签语法,它既不是字符串也不是HTML,它被称为JSX,是一个JavaScript的语法扩展,建议在React中配合使用JSXJSX可以很好地描述UI应该呈现出它应有交互地本质形式。JSX可能会使用人联想到模板语言,但它具有JavaScript的全部功能

注意:对于JSX来说,虽然是一种JavaScript语法扩展,但是你能发现其无法直接使用在HTML中,需要借助Babel的转换,转换后会自动帮我们解析成想要的样式

二、JSX介绍

JSXHTML语法直接接入到JavaScript代码中,再通过翻译器转换到纯JavaScript后由浏览器执行,在实际开发中,JSX在产品打包阶段都已经编程成纯JavaScript,不会带来任何副作用,反而会让代码更加直观并易于维护,编译过程由BabelJSX编译器实现

三、JSX原理

要明白JSX的原理,需要先明白如何用JavaScript对象来表现一个DOM元素的结构

1、DOM结构示例

<div class='app' id='appRoot'><h1 class='title'>欢迎进入React的世界</h1><p>React.js是一个帮助你构建页面UI的JavaScript库</P>
</div>

上面这个HTML所有的信息我们都可以用JavaScript对象来表示:

{tag:'div',attrs:{className:'app',id:'appRoot'},children:[{tag:'h1',attrs:{className:'title'},children:['欢迎进入React的世界']}{tag:'p',attrs:null,children:['React.js是一个帮助你构建页面UI的JavaScript库']}]
}

但是用JavaScript写起来太长,结构看起来又不清晰,用HTML的方式写起来就方便很多了。于是React.js就把JavaScript的语法扩展了一下,让JavaScript语言能够支持这种直接在JavaScript代码里边编写类似HTML标签结构的语法,这样写起来就方便很多了。编译的过程会把类似HTML的JSX结构转换成JavaScript的对象结构

2、HTML的JSX结构示例

import React from 'react'class App extends React.Component {render() {return (<div class='app' id='appRoot'><h1 class='title'>欢迎进入React的世界</h1><p>React.js是一个帮助你构建页面UI的JavaScript库</p></div>)}
}export default App
//从react的包当中引入了React。只要你要写React.js组件就必须引入React,因为react里有一种语法叫JSX
import React from 'react'
//ReactDOM可以帮助我们把React组件渲染到页面上去
import ReactDOM from 'react-dom'
import App from './component/classComponent'//ReactDOM里有一个render方法,就是把组件渲染并且构造DOM树,然后插入到页面上某个特定的元素上
ReactDOM.render(<App/>,document.getElementById("root")
)

3、编译之后的代码

import React from 'react'class App extends React.Component {render() {return (React.createElement("div",{className: 'app',id: 'appRoot'},),React.createElement("h1",{className: 'title',},"欢迎进入React的世界"), React.createElement("p",null,"React.js是一个构建页面UI的JavaScript库"))}
}export default App
//从react的包当中引入了React。只要你要写React.js组件就必须引入React,因为react里有一种语法叫JSX
import React from 'react'
//ReactDOM可以帮助我们把React组件渲染到页面上去
import ReactDOM from 'react-dom'
import App from './component/classComponent'//ReactDOM里有一个render方法,就是把组件渲染并且构造DOM树,然后插入到页面上某个特定的元素上
ReactDOM.render(React.createElement(App),document.getElementById("root")
)

React.createElement会构建一个JavaScript对象来描述你HTML结构的信息,包括标签名、属性、子元素等,语法为:

React.createElement(type,[props],[...children]
)

所谓的JSX其实就是JavaScript对象,所以使用React和JSX的时候一定要经过编译的过程

JSX一使用react构造组件,bable进行编译->JavaScript对象 — ReactDOM.render()->DOM元素->插入页面

四、为什么使用JSX

1、JSX的特点

  1. React认为渲染逻辑本质上与其他UI逻辑内在耦合,比如,在UI中需要绑定处理事件、在某些时刻状态发生变化时需要通知到UI,以及需要在UI中展示准备好的数据
  2. React并没有采用将标记与逻辑进行分离到不同文件这种人为地分离方式,而是通过将二者共同存放在称之为“组件”的松散耦合单元之中,来实现关注点分离
  3. React不强制要求使用JSX,但是大多数人发现,在JavaScript代码中将JSX和UI放在一起时,会在视觉上有辅助作用。它还可以使React显示更多有用的错误和警告消息

2、JSX的书写规范

  • JSX的顶层只能有一个根元素,所以我们很多时候会在外层包裹一个div原生
  • 为了方便阅读,我们通常在JSX的外层包裹一个小括号(),这样可以方便阅读,并且JSX可以进行换行书写
  • JSX中的标签可以是单标签,也可以是双标签

注意: 如果是单标签,必须以/>结尾

五、JSX的使用

1、嵌入JS表达式

JavaScript表达式

let content = '插入的内容' //存储在js中的数据
let h1 = ( <h1>{content}</h1> )

js表达式如a,a+b,functionName(param)函数调用表达式,array.map()函数,function test ()
{} 定义函数等等,都可以用一个变量进行接收。也可以写 { console.log(1) }

//array.map()是有返回值的
let arr = [1,2,3,4]
let result = arr.map((num) => {return num+1
})
console.log(result) //[2,3,4,5]
//定义函数,其本身也是返回值
const x = function test(){console.log('1')
}console.log(x)
/* 这个函数本身
test(){console.log('1')
}
*/
  • 只要是合法的js表达式(如各种数据类型)都可以进行嵌入
  • JSX自身也是js表达式
  • js中的对象不能嵌入,一般只会出现在style属性中
import React from 'react'
import ReactDOM from 'react-dom'// 函数调用表达式
const sayHi = () => 'Hi~' //函数调用后返回字符串Hi~const dv = <div>我是一个div</div> //dv是JSXconst title = (<h1><p>{1}</p><p>{'a'}</p><p>{1 + 7}</p><p>{3 > 5 ? '大于' : '小于等于'}</p><p>{sayHi()}</p>{dv} {/*JSX自身也是js表达式,也可以嵌入到JSX中*/}{/* 以下为错误演示:注意——注释是js中的,嵌入到jsx中的注释也需要用花括号括起来 */}{/* <p>{ {a: '6'} }</p> 花括号里一般不写对象,除非在style属性中*/}{/* { if (true) {} } 花括号中不能出现语句 */}{/* { for (var i = 0; i < 10; i++) {} } 花括号中不能出现语句*/}</h1>
)// 渲染
ReactDOM.render(title, document.getElementById('root'))

2、条件渲染

用 if/else 或 三元运算符 或 逻辑与运算符 来实现

import React from 'react'
import ReactDOM from 'react-dom'const isLoading = false// if-else
// const loadData = () => {
//   if (isLoading) {
//     return <div>loading...</div>
//   }
//   return <div>数据加载完成,此处显示加载后的数据</div>
// }// 三元表达式:
// const loadData = () => {
//   return isLoading ? (<div>loading...</div>) : (<div>数据加载完成,此处显示加载后的数据</div>)
// }// 逻辑与运算符:
const loadData = () => {return isLoading && (<div>loading...</div>)
}const title = (<h1>条件渲染:{loadData()}  {/*把函数调用的返回值嵌入JSX*/}</h1>
)
ReactDOM.render(title, document.getElementById('root'))

3、列表渲染

用数组的 map () 方法,返回一个新数组,数组中的元素为原始数组元素按序依次调用函数处理后的值。

①、arr.map()

  • 渲染列表的时候需要添加key属性,key属性的值要保证唯一
  • map()遍历谁,就给谁添加key属性
  • 尽量避免使用(可变化的)索引号作为key,比如map的第二个参数index,不建议将其作为key值
//数组可以作为 react的合法节点进行遍历,所以下例不报错。但对象不能
let arr = [<li>aaa</li>, <li>bbb</li>]
const list = (<ul>{arr}</ul>
)

可以把原来的纯数据[‘aaa’, ‘bbb’]加工成带有标签的数据,等价于:

//增加一个id属性作为key值
let arr = [{id:1,name:'aaa'
},{id:2,name:'bbb'
}]
//创建虚拟DOM
const list = (<ul>{arr.map(item => <li key={item.id}> {item.name} </li>)}</ul>
)
//渲染虚拟DOM
ReactDOM.render(list,document.getElementById('root'))

六、组件

1、类组件

ES6的加入让JavaScript直接支持使用class来定义一个类,react创建组件的方式就是使用的类的继承,ES6 class是目前官方推荐的使用方式,它使用了ES6标准语法来构建

import React from 'react'class App extends React.Component {render() {return (<div>hellow react Component</div>)}
}export default App;
//从react的包当中引入了React。只要你要写React.js组件就必须引入React,因为react里有一种语法叫JSX
import React from 'react'
//ReactDOM可以帮助我们把React组件渲染到页面上去
import ReactDOM from 'react-dom'
import App from './component/classComponent'//ReactDOM里有一个render方法,就是把组件渲染并且构造DOM树,然后插入到页面上某个特定的元素上
ReactDOM.render(<App/>,document.getElementById("root")
)

①、实例化组件

ES6 class组件其实就是一个构造器,每次使用组件都相当于在实例化组件

import React from 'react'class App extends React.Component {render() {return (<div>hellow react Component</div>)}
}const app = new App({name:'react'
}).render()export default App;
//从react的包当中引入了React。只要你要写React.js组件就必须引入React,因为react里有一种语法叫JSX
import React from 'react'
//ReactDOM可以帮助我们把React组件渲染到页面上去
import ReactDOM from 'react-dom'
import App from './component/classComponent'//ReactDOM里有一个render方法,就是把组件渲染并且构造DOM树,然后插入到页面上某个特定的元素上
ReactDOM.render(app,document.getElementById("root")
)

2、函数组件

function App(){return(<div>hello functional component</div>)
}
export default App
import React from 'react'
import ReactDOM from 'react-dom'
import App from './component/functionComponent'ReactDOM.render(<App />,document.getElementById("root")
)

3、组件样式

①、行内样式

想给虚拟dom添加行内样式,需要使用表达式传入样式对象的方式来实现:

<div style={{backgroundColor:"red",fontSize:"13px"}}>Hello World</div>

行内样式需要写入一个样式对象,而这个样式对象的位置可以放在很多地方。例如:render函数里、组件原型上、外链js文件中

import React, { Component } from 'react'export default class nestComponent extends Component {render() {var objStyle = {backgroundColor: "pink",fontSize: "15px"}return (<div><div style={objStyle}>nestComponent</div><div style={{backgroundColor:"purple"}}>Hello World</div></div>)}
}

在这里插入图片描述

②、使用class

React推荐我们使用行内样式,因为React觉得每一个组件都是一个独立的整体。
其实我们大多数情况下还是大量的在为元素添加类名,但是需要注意的是,class需要携程className(因为毕竟是在写类JS代码,会收到JS规则的存在,而class关键字)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、总结

实际上,JSX 仅仅只是 React.createElement(component, props, …children) 函数的语法糖。所有的JSX最终都会被转换成React.createElement的函数调用。如果你想深入了解 JSX 的实现原理,请详见link深入JSX

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/141277.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全自动情感故事对话视频生成神器

搞笑聊天视频是近年来备受欢迎的一种娱乐形式&#xff0c;它能够快速、简单地制作出形象生动、幽默搞笑的对话视频&#xff0c;给人带来欢乐与笑声。而今天&#xff0c;我要向大家介绍的是一款功能强大、操作简单的搞笑聊天视频生成器。 这款聊天视频生成器具备多项令人惊叹的…

排序算法二 归并排序和快速排序

目录 归并排序 快速排序 1 挖坑法​编辑 2 Hoare法 快排的优化 快排的非递归方法 七大排序算法复杂度及稳定性分析 归并排序 归并排序是建立在归并操作上的一种有效的排序算法,将以有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,在使子序列段间有序.若将两…

virtualbox无界面打开linux虚拟机的bat脚本,以及idea(代替Xshell)连接linux虚拟机的方法

virtualbox无界面打开linux虚拟机的bat脚本&#xff0c;以及idea连接linux虚拟机的方法 命令行运行代码成功运行的效果图 idea连接linux虚拟机的方法【重要】查看虚拟机的IP地址idea中选择菜单&#xff08;该功能可代替Xshell软件&#xff09;配置设置连接成功进入idea中的命令…

2018-2022年盟浪 ESG数据

2018-2022年盟浪 ESG数据 1、时间&#xff1a;2018-2022年 2、指标&#xff1a;证券代码、证券简称、盟浪ESG评级、省份、城市、所属证监会行业名称[交易日期] 最新收盘日[行业级别] 大类行业、所属证监会行业代码[交易日期] 最新收盘日[行业级别] 大类行业 3、范围&#xf…

ISE_ChipScope Pro的使用

1.ChipScope Pro Core Inserter 使用流程 在之前以及编译好的流水灯实验上进行学习 ChipScope的使用。 一、新建一个ChipScope 核 点击Next,然后在下一个框中选择 Finish&#xff0c;你就会在项目菜单中看到有XX.cdc核文件。 二、对核文件进行设置 右键“Synthesize – XST” …

【LeetCode热题100】--53.最大子数组和

53.最大子数组和 使用动态规划&#xff1a; 状态定义&#xff1a;设动态规划列表dp&#xff0c;dp[i]代表以元素nums[i]为结尾的连续子数组最大和 转移方程&#xff1a;若dp[i-1]≤0,说明dp[i-1]对dp[i]产生负贡献&#xff0c;即dp[i-1]nums[i]还不如nums[i]本身大 初始状态&…

vue+element项目创建步骤

一、创建vue项目步骤 要创建一个Vue Element UI的项目&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1.确保你已经安装了Node.js和npm&#xff08;Node.js的包管理器&#xff09;。你可以在命令行中运行以下命令来检查它们是否已经安装&#xff1a; node -vnpm -v2.使…

打开深度学习的锁:(2)单隐藏层的神经网络

打开深度学习的锁 导言PS&#xff1a;神经网络的训练过程一、数据集和包的说明1.1准备文件1.2 需要导入的包 二、构建神经网络的架构三、初始化函数四、激活函数4.1 tanh&#xff08;双曲正切函数&#xff09;函数 五&#xff0c;前向传播六、损失函数七、后向传播八、梯度下降…

vite + vue3 + js 搭建组件库 + 核心配置与使用

vite.config.js 这个官网有写 import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path" // https://vitejs.dev/config/ export default defineConfig({plugins: [vue()],server:{open:true, //自动打开浏览port:8088 //默认…

适用于初学者,毕业设计的5个c语言项目,代码已开源

C语言项目集 项目介绍 该项目适用于初学者学习c语言&#xff0c;也适用于高校学生课程设计&#xff0c;毕业设计参考。 项目并不能满足所有人的需求&#xff0c;可进行项目指导&#xff0c;定制开发。 开源地址 c语言项目代码地址 项目列表 该项目包含如下5个管理系统&am…

游戏录屏软件推荐,教你录制高清游戏视频

“有没有好用的游戏录屏软件推荐呀&#xff0c;最近当上了游戏主播&#xff0c;平台要求每天都要发一个游戏视频&#xff0c;可是我的游戏录屏软件太拉胯了&#xff0c;录制出来的视频非常糊&#xff0c;导致平台审核不通过&#xff0c;所以想问问大家有没有游戏录屏软件推荐一…

Vue的单文件组件(Single File Components):优势与实例

Vue的单文件组件&#xff08;Single File Components&#xff09;&#xff1a;优势与实例 Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;它采用了一种特殊的组件化开发方式&#xff0c;被称为单文件组件&#xff08;Single File Components&#xff0c;简称 SFC&#…

Eclipse初步学习使用

1.配置自动填充 window->preference 2.自动判断错误&#xff0c;并给出解决方法 3.创建可执行文件&#xff1a; 新建package&#xff0c; 包内新建 javaclass&#xff0c;选择psvm&#xff0c; 4.编写程序&#xff0c;进行执行 右键&#xff0c;选择 run as applic…

ideogram.ai 不同风格的效果图

https://ideogram.ai/ 提示词&#xff1a; French bulldog with sunglasses, playing skateboarding, speed up, happiness, front viewPhoto 相片 正常照片 Poster 海报 偏绘画&#xff0c;清晰的勾线 3D Render 3D 渲染 胶质感&#xff0c;像 3D 模型 Typography …

MySQL学习笔记15

1、内连接查询&#xff08;重点&#xff09;&#xff1a; 基本语法&#xff1a; select 数据表1.字段列表,数据表2.字段列表 from 数据表1 inner join 数据表2 on 连接条件; 案例&#xff1a;获取产品表中每个产品的分类信息&#xff1a; mysql> select * from tb_goods …

Linux-文件和目录权限

文章目录 权限的作用普通文本文件的权限作用目录文件权限功能作用 文件权限的设置 权限的作用 权限对于普通文件和目录文件的作用是不一样的。 普通文本文件的权限作用 drwxr-xr-x第二个字母开始是文件的权限表示9列权限&#xff0c;前三列表示文件的"拥有者"对该…

vue组件样式 scoped 冲突

vue组件样式 冲突 <template><div class"base-one">BaseOne</div> </template><script> export default {}; </script>/* 1.style中的样式 默认是作用到全局的2.加上scoped可以让样式变成局部样式组件都应该有独立的样式&…

如何将前后端分离的项目部署在服务器上

宝塔Linux部署&#xff1a; 因为要部署前端我们先下个nigx Tomcat,下载这个只是为了java&#xff0c;它里面包含java的 前端 在去添加站点&#xff0c;域名暂时是自己的公网 然后打开新建的站点&#xff0c;把里面的文件全删掉&#xff0c;再把自己的前端dist里的文件全选拖…

使用ALU,RAM,寄存器打造一个CPU

CPU简介 计算机的心脏是中央处理单元&#xff0c;简称“CPU” 。这篇文章就利用前几篇文章中提到过的ALU,RAM,寄存器组件做一个CPU。 CPU负责运行程序&#xff0c;程序是由一个个操作组成的&#xff0c;这些操作叫做指令&#xff0c;因为他们“指示”计算机要做什么. CPU能做什…

算法通过村第九关-二分(中序遍历)黄金笔记|二叉搜索树

文章目录 前言1. 有序数组转二叉搜索树2. 寻找连个正序数组的中位数总结 前言 提示&#xff1a;有时候&#xff0c;我感觉自己一辈子活在两个闹钟之间&#xff0c;早上的第一次闹钟&#xff0c;以及5分钟之后的第二次闹钟。 --奥利弗萨克斯《意识的河流》 每个专题都有简单题&a…