【React】JSX语法

news2024/11/16 23:50:27

目录

  • 一、前言
  • 二、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是JSX

const 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.coloradmin.cn/o/1040324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无缝转换:将File转化为MultipartFile,轻松应对文件上传

无缝转换&#xff1a;将File转化为MultipartFile&#xff0c;轻松应对文件上传 1、概述2、文件转换2.1、 什么是 MultipartFile2.2、将 File 对象转换为 MultipartFile 对象 3、总结 1、概述 大家好&#xff0c;我是欧阳方超&#xff0c;可以关注我的公众号“欧阳方超”&#…

Linux 搭建 Oracel 10g 环境

Oracle 操作 1. Linux 安装 oracle 10g (1) 登录系统 操作系统: Kylin 3.2 硬盘空间: 8G 以上 数据库版本: oracle 10.2.0 使用 root 用户登录操作系统&#xff0c;若为普通用户使用su命令切换至 root用户。 (2) 准备文件 将数据库安装文件&#xff08;10201_database_…

字节8年经验之谈 —— 10大自动化测试框架总结!

软件行业正迈向自主、快速、高效的未来。为了跟上这个高速前进的生态系统的步伐&#xff0c;必须加快应用程序的交付时间&#xff0c;但不能以牺牲质量为代价。快速实现质量是必要的&#xff0c;因此质量保证得到了很多关注。为了满足卓越的质量和更快的上市时间的需求&#xf…

LL库实现正交编码器数据采集

1&#xff0c;首先打开STM32CubeMX&#xff0c;配置一下工程&#xff0c;这里使用的芯片是STM32F103C8T6。 我这里选择了定时器2和3&#xff0c;因为我有两个电机&#xff0c;在定时器模式这边&#xff0c;我们在Combined Channels这个选项里面我们选择Encoder Mode&#xff0c…

IDEA远程调试Remote Debug

配置idea远程调试 输入服务器ip&#xff0c;并且复制启动参数&#xff1a; -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 使用IDEA远程调试自动生成的参数启动服务器 java -Xdebug -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 -jar …

Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的八月更新。在本次更新中&#xff0c;我们将推出新的以应用程序为中心的视图支持&#xff0c;帮助开发人员在一个项…

LVS+Keepalived:实现高效软负载均衡的利器

一、概念 LVS是Linux Virtual Server的简写&#xff0c;意即Linux虚拟服务器&#xff0c;是一个虚拟的服务器集群系统&#xff0c;它可以通过不同的调度算法和工作模式&#xff0c;将客户端的请求转发给后端的真实服务器。 Keepalived是一个基于VRRP协议来实现的服务高可用方案…

【遥遥领先】Eolink IDEA 插件:零代码入侵,自动生成接口

省流版&#xff1a; Eolink 有 IDEA 插件吗&#xff1f; 有&#xff0c;而且遥遥领先&#xff01;我们在一年半之前就发布了&#xff0c;而且功能更丰富&#xff01; IDEA 插件市场搜索“Eolink Apikit”即可安装使用。 &#x1f680;使用指引&#xff1a;Eolink - IntelliJ ID…

【注射论文基因,那些年不为人知的AI工具】

我们都知道写论文有很多前期准备工作&#xff0c;例如<任务书>、<文献综述>等等&#xff0c;那么我们能够用什么工具最大限度的提高完成效率的同时还能保证质量呢&#xff0c;让我们接着往下看&#x1f447; 1.文献快速阅读-iTextMaster 文章主题确定了&#xff0…

最强大的iOS应用源码保护工具:Ipa Guard,保护你的商业机密代码

前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可执行文件进行深度混淆、加密。使用任何工具都无法逆向、破解还原源文件。对APP进行完整性保护&#xff0c;防止应用程序中的代码及资源文件被恶意篡改。Ipa Guard通过修改 ipa 文件中的…

知识储备--基础算法篇-贪心算法

1.贪心算法 1.1贪心算法与背包问题的区别 贪心算法能够通过局部最优去推出全局最优&#xff0c;而背包问题不行&#xff0c;需要用动态规划的方法来解决。 1.2套路 贪心算法没有套路&#xff01;&#xff01; 主要想清楚怎么得到该阶段的局部最优解&#xff0c;如何通过局…

Java学习笔记②

java反射 值的修改 public等属性的值的修改很简单。但private&#xff0c;final的值修改有改变。 比如修改下类的4个属性。 class privateClass {private String privateField "private value";private final String finalPrivateField "final private va…

C语言每日一题(9):跳水比赛猜名次

文章主题&#xff1a;跳水比赛猜名次&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&am…

飞书与企业微信的异同

云文档 飞书的云文档会自动用游览器打开&#xff0c;不会直接在PC应用中打开&#xff08;移动端能在应用中打开&#xff09;。 飞书云文档能够插入视频、流程图、问卷等等 聊天消息交互 钉钉也有类似的功能&#xff0c;可以针对消息进行点赞等回复 钉钉的消息回复还有【收到…

触觉智能 PurPle Pi OH(OpenHarmony)开发板

资料汇总 内容预览 产品介绍 PurPle-Pi OH 规格书​​​​​​ 系统编译 Purple-Pi-OH Linux SDK编译 Purple-Pi-OH OHOS SDK编译 使用手册 Purple-Pi-OH Ubuntu系统使用手册 常见FAQ 常见问题 官网 官网地址 Purple Pi OH介绍 Purple Pi OH作为一款兼容树莓派的开…

Springcloud实战之自研分布式id生成器

一&#xff0c;背景 日常开发中&#xff0c;我们需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应 一个订单。我们现实生活中也有各种 ID &#xff0c;比如身…

【并联有源电力滤波器】基于pq理论的并联有源电力滤波器(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

顾曼宁(顾曼)参加蚂蚁生态全球CEO大会:相信的力量,共筑未来

今天,2023年9月15日,在湖州太湖,蚂蚁生态全球的CEO们举行了一场引人注目的盛会。 时隔三年,这些顶尖的商业领袖们再次齐聚一堂,分享智慧、交流想法,这是一个充满激情和共鸣的时刻,也是一次充满感慨和思考的聚会。 在这场盛会中,顾曼宁(顾曼)特别感谢了蚂蚁集团董事长Eric的精彩…

51单片机自行车码表 速度里程计霍尔测速模拟电机设计

一、系统方案 本设计采用51单片机作为主控器&#xff0c;霍尔测速&#xff0c;数码管显示速度及里程数。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 void init() { IT01; //INT0负跳变触发 TMOD0x01;//定时器工作于方式1 TH00x3c; //5…

[Unity开发小技巧]快速切换打包平台

如果大家有什么需要实现的功能,可以加入我的知识星球向我提问,我会尽量实现并提供解答,也可以加入我的开发交流群进行交流 视频地址:Unity快速切换平台的解决方案知识星球地址:[Unity开发小技巧]快速切换打包平台 今天给大家分享的是一个开发小技巧,在开发多个端的项目…