React02-JSX 语法

news2024/11/25 22:35:37

一、React 基础知识

1. React.createElement

React.createElement 是 jsx 语法的编译结果,这个函数用来创建一个 React 元素,它的返回值是一个 Virtual DOM(虚拟DOM)。

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

第一个参数为元素类型,可以是标签名或组件名,第二个参数为元素属性,第三个参数为子节点列表。

const html1 = <h1>hello</h1>;
const html2 = React.createElement('h1', null, 'hello');

以上2种写法是等价的,可以看到使用 jsx 语法更加简介直观。

2. ReactDOM.render

ReactDOM.render(cpn, dom) 方法用来将一个 react 组件渲染到 DOM 元素上。

第一个参数为要渲染的组件,可以是 jsx 语句;第二个参数为要渲染到的真实 DOM 元素。

ReactDOM.render(<h1>hello</h1>, document.getElementById('reactApp'));

二、定义组件

1. 类组件

使用关键字 class 定义的组件。需要继承 React.Component 类,重写 render 方法,在 render 方法中返回 jsx 语法定义的组件。

// 类组件
export default class Person extends React.Component {
  render() {
    return <div>hello world</div>;
  }
}

2. 函数组件

使用关键字 function 定义的组件。返回 jsx 语法定义的组件。

export default function Person() {
  return <div>hello web</div>;
}

3. 注意事项

(1) 组件名的首字母必须大写,首字母大小写是 react 区分组件和普通标签的方法。

(2) 组件中返回的 jsx 代码必须有且只有1个顶层标签。

4. 组件嵌套

父组件嵌套子组件,将子组件的组件名当作标签名按标签的方式使用即可。

// 子组件
function Son() {
  return <div><p>这是子组件</p></div>;
}

// 父组件
export default function Father() {
  // return <div><h3>这是父组件</h3><Son></Son></div>;
  return <div><h3>这是父组件</h3><Son /></div>; // 和上面一句写法等价
}

注意: 组件当作标签使用的时候,必须是闭合标签。

三、JSX 语法

JSX 是 JS 的扩展语言,本质还是 JS。

1. 表达式

jsx 使用 { expression } 的方式获取表达式的值。

在 jsx 中如果需要使用 js 表达式,需要写在花括号({})内。

const name = 'zhangsan';
export default function Person() {
  return <div><h3>{ name }</h3></div>;
}

在页面渲染时,name 会被渲染成 zhangsan。

jsx 本身也是一个表达式,可以定义一个 jsx 表达式变量,可以在创建组件时直接返回此变量。

const name = 'lisi';
const html = <div><h3>{ name }</h3></div>;
export default function Person() {
  return html;
}

2. 属性

此外,还可以在 jsx 中加入属性。

export default function Person() {
  return <div id="div"><h3></h3></div>;
}

如果我们直接用 html 的方式定义属性,那渲染到页面后,Person 组件中 div 的 id 就是 div。

如果想要用表达式作为属性值,同样也是使用花括号。

const div = 'div1';
export default function Person() {
  return <div id={div}><h3></h3></div>;
}

这时 div 的 id 就为 div1。

无论在 jsx 内容还是属性或者是 jsx 本身,都可以使用 js 表达式。

3. className

jsx 中不能使用 class 给元素添加类名。jsx 中 jsx 本身也是 js,在 js 中 class 是 js 的关键字,因此需要使用 className 给元素添加类名。

const div = 'div1';
const className = 'div2';
export default function Person() {
  return <div id={div} className={ className }><h3></h3></div>;
}

这时 div 就有了一个 class 为 div2。

4. jsx 自动展开数组

在 jsx 中,数组会自动进行展开。

const arr = ['zhangsan', 'lisi', 'wangwu'];
export default function Person() {
  return <div>{ arr }</div>;
}

此时页面上将渲染出 zhangsanlisiwangwu:

也可以使用数组来渲染一组标签:

const arr = [<p key='1'>c++</p>, <p key='2'>python</p>, <p key='3'>php</p>];
export default function Person() {
  return <div>{ arr }</div>;
}

在页面上将渲染为一组 p 标签:

 5. 三元运算

在 jsx 中可以使用三元表达式来控制某个元素是否渲染。

const bl = true;
export default function Person() {
  return <div>{ bl ? <h3>hello world</h3> : null }</div>;
}

当 bl 为 true 时,页面上会渲染出 h3 标签;当 bl 为 false 时,就不渲染。

这个功能还有一种更简单的方式:

const bl = true;
export default function Person() {
  return <div>{ bl && <h3>hello world</h3> }</div>;
}

使用且运算,当 bl 会真时,继续向后运算;bl 为假时,就终止。

6. 循环

要在 jsx 中使用循环,需要使用 map。

const arr = [{ id: 1, name: 'zhangsan', age: 10 }, { id: 2, name: 'lisi', age: 15 }, { id: 3, name: 'wangwu', age: 20 }];
export default function Person() {
  return <div>
    <ul>
      { arr.map(item => <li key={ item.id }>{ item.name },{ item.age }</li>) }
    </ul>
  </div>;
}

7. 事件

on + 事件名 给组件标签添加事件。

  • 事件名的首字母必须大写。
  • 类组件中的 jsx 中的 this 指向实例对象。
export default function Person() {
  function fn() {
    console.log('hello world');
  }
  return <div>
    <button onClick={fn}>按钮</button>
  </div>;
}

点击按钮时,控制台就会打印出 hello world。

可以给函数 fn 传递参数,遵循以下规则。

函数传参:

(1) 默认传递一个参数事件对象

按钮的点击事件会默认传入一个事件对象,我们可以使用一个参数来接收。

export default function Person() {
  function fn(e) {
    console.log(e); // SyntheticBaseEvent 事件对象
  }
  return <div>
    <button onClick={fn}>按钮</button>
  </div>;
}

(2) 通过箭头函数自定义传参

export default function Person() {
  function fn(e, a) {
    console.log(e); // SyntheticBaseEvent 事件对象
    console.log(a); // hello
  }
  return <div>
    <button onClick={(event) => fn(event, 'hello')}>按钮</button>
  </div>;
}

这里我们使用一个箭头函数作为按钮的点击事件,接收事件对象并和其他参数一起传递给 fn。

(3) 通过 bind 方法

export default function Person() {
  function fn(e, a) {
    console.log(e); // world
    console.log(a); // SyntheticBaseEvent 事件参数
  }
  return <div>
    <button onClick={fn.bind(null, 'world')}>按钮</button>
  </div>;
}

使用 bind 方法也可以实现自定义传参,此时第一个参数为 bind 方法传入的 world,第二个参数是事件对象。

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

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

相关文章

数据库之MySQL仓库安装

目录 数据库之MySQL仓库安装 在官方文档获得安装地址 点击链接进入后&#xff0c;选择 MySQL Yum Repository 进入网页后&#xff0c;选择自己Linux所对应的版本&#xff08;我的是Linux8&#xff09; 选择No thanks&#xff0c;juststart my download 选择复制链接地址 …

12.1 计算机硬件基础

目录 底层课程导学 课程回顾 1.编程基础 2.应用开发&#xff08;使用操作系统提供的函数开发应用程序&#xff09; 3.底层开发&#xff08;开发操作系统本身&#xff0c;向下管理硬件、向上提供接口&#xff08;API&#xff09;&#xff09; 嵌入式系统分层 应用开发 底…

PLC技能引领自动化控制系统的设计与开发

学习了PLC后&#xff0c;您可以从事各种与自动化控制系统相关的工作。以下是一些可能的职业方向&#xff1a; 自动化工程师&#xff1a;作为自动化工程师&#xff0c;您将负责设计、开发和维护自动化控制系统&#xff0c;其中包括PLC编程、传感器和执行器的集成以及系统调试和…

CAD怎么转JPG图片?三种方法教你快速转换

CAD文件只能在安装了CAD软件的电脑上打开&#xff0c;而JPG图片可以在几乎所有设备上打开&#xff0c;包括电脑、手机和平板电脑等&#xff0c;这样可以更方便地分享和传递设计文件。无需考虑对方是否有安装CAD软件。那么我们怎么把CAD文件转换成JPG图片呢&#xff1f;教大家三…

管理类联考——英语——趣味篇——不择手段——c开头单词

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

CMIS_GOV_STD

自然资源“一张图”综合管理系统【标准版】

shell脚本-cp命令复制目录报错cp: omitting directory

cp 复制目录报错&#xff0c;如下&#xff1a; 【报错原因】&#xff1a; cp命令默认是不能复制目录的&#xff0c;需要加参数 【解决办法】&#xff1a; 使用cp -r命令进行复制&#xff0c;递归处理&#xff0c;将指定目录下的所有文件与子目录一并处理。 【拓展】cp语法 cp…

数据标注:数字病理学中的人工智能

在数字病理学中&#xff0c;组织样本的显微图像被传输到计算机&#xff0c;并使用先进的图像处理技术和计算机视觉对其进行分析。 医学图像和诊断的数字化为病理学中的人工智能开辟了途径。病理学家可以使用机器学习模型来进行增强分析并提高结果准确性。此外&#xff0c;病理学…

socat: 网络链接和一些简易的RPC

除了这些功能之外&#xff0c;端口转发&#xff0c;也是相当的方便实用, 小型产品的RPC 都可以通过&#xff0c;指定程序去执行

华为OD机试真题B卷 Python 实现【整理扑克牌】,附详细解题思路

目录 一、题目描述步骤1步骤2步骤3 二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 给定一组数字&#xff0c;表示扑克牌的牌面数字&#xff0c;忽略扑克牌的花色&#xff0c;请按如下规则对这一组扑克牌进行整理&am…

使用kubeshpere创建k8s容器日志系统grafana-loki

k8s日志聚合平台grafana-loki&#xff0c;可以统一查看所有容器的日志运行。 效果&#xff1a; 使用kubeshpere创建loki应用十分的方便&#xff0c;减少了很多操作&#xff0c;易用的同时也实用&#xff0c;k8s不再是精通人员才能使用的编排系统。 1、在企业空间中&#xff0…

100种思维模型之能力圈思维模型-91

芒格说&#xff1a; “ 一个人在一生中可以真正得到的真见卓识仍然非常有限&#xff0c;所以正确的决策必须局限在自己的 ‘ 能力圈’ 以内。 ” 巴菲特说&#xff1a; “对你的 能力圈 来说&#xff0c;最重要的不是能力圈的范围大小&#xff0c;而是你如何能够 确定能…

虹科教程 | Linux网络命名空间与虹科PROFINET协议栈的GOAL中间件结合使用

前言 PROFINET是由PI推出的开放式工业以太网标准&#xff0c;它使用TCP/IP等IT标准&#xff0c;并由IEC 61158和IEC 61784 标准化&#xff0c;具有实时功能&#xff0c;并能够无缝集成到现场总线系统中。凭借其技术的开放性、灵活性和性能优势&#xff0c;PROFINET可应用于过程…

git上传文件到Gitee报错“error: failed to push some refs to ‘https://gitee.com/xxxx”

文章目录 前言一、创建项目仓库二、创建工作区三、配置 LFS四、上传镜像文件 前言 我要将一个 4.27 GB 的文件上传到 Gitee 上&#xff0c;但是出现了下面这样的报错 error: failed to push some refs to https://gitee.com/xxxx/centos.git 因此记录一下解决报错的方法。 一、…

eBPF内核技术在滴滴云原生的落地实践

将滴滴技术设为“星标⭐️” 第一时间收到文章更新 导读 eBPF是Linux内核革命性技术&#xff0c;能够安全高效地扩展内核能力&#xff0c;应用广泛&#xff0c;尤其是在云原生可观测性领域的应用已经成为行业热点。在滴滴云原生环境中&#xff0c;eBPF技术进行了业务实践和内源…

23西安电子科技大学电子工程学院821考研录取情况

01、电子工程学院各个方向 02、23电子工程学院一志愿考研录取情况总览、平均分 PS&#xff1a;电院23年院线相对于22年院线上涨10-15分&#xff0c;个别专业下降5分&#xff0c;这是因为22年西电电院报名人数较少&#xff0c;导致23年增加了一部分人数。 PS&#xff1a;1、电院…

前端 | windows安装nvm管理node.js

文章目录 01 nvm介绍02 安装03 设置镜像04 安装与版本管理05 基础使用 01 nvm介绍 nvm&#xff0c;即node version manager&#xff0c;是一个方便切换和管理node.js版本的工具。 安装nvm前的注意事项&#xff1a; 卸载掉现有的node.js所有安装目录避免出现空格和中文选用管理…

PaoPao泡泡清新文艺的微社区系统源码

泡泡是一个真正意义上高性能的微社区&#xff0c;虽然规模不大却拥有完备的功能。 该系统采用了GoZinc架构&#xff0c;前端使用Vue3进行构建&#xff0c;采用清新简洁的设计风格&#xff0c;布局类似Twitter的三栏设计。 后端服务使用Go编写&#xff0c;仅占用8MB的内存&…

Meta将生成人工智能功能应用于其产品能否提升吸引力?

随着技术的不断进步&#xff0c;人工智能在各个领域发挥着越来越重要的作用。最近&#xff0c;Meta公司宣布将在旗下产品中加入生成人工智能功能&#xff0c;以提升其吸引力。这一举措引起了广泛关注&#xff0c;人们开始思考&#xff0c;Meta将生成人工智能功能应用于其产品是…

可以提升效率的时间管理APP,上班族的好帮手

在时间少&#xff0c;但是待办事项多的快节奏社会中&#xff0c;时间管理成为了很多人都需要面临的重要问题。特别是对于繁忙的上班族来说&#xff0c;高效地利用时间是提升工作效率的关键。有不少上班族都在为如何高效管理时间而烦恼&#xff0c;于是一些时间管理工具应运而生…