react(一):特点-基本使用-JSX语法

news2025/3/15 6:05:49

初识React 

React是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发和维护。

官网文档:React 官方中文文档

特点

1.声明式编程

2.组件化开发

3.多平台适配

开发依赖

开发React必须依赖三个库:

1.react:包含react所必须的核心代码

2.react-dom:react渲染在不同平台所需要的核心代码

3.babel:将jsx转换成React代码的工具

引入依赖的方式:

1.CDN引入

<!-- CDN引入 -->
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

2.下载后,添加本地依赖

3.npm管理

案例-普通方式实现

注意:React18前后,渲染组件的书写方式较为不同

React18之前:使用 ReactDOM.render() 方法来渲染组件

React18之后:使用 ReactDOM.createRoot() 方法来渲染组件

<body>
  <div id="root"></div>

  <!-- 1.引入依赖 -->
  <script src="https://unpkg.com/react@18/umd/react.development.js"></script>
  <script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
  <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

  <!-- 编写React代码 -->
  <script type="text/babel">
    // React18之前:ReactDOM.render()
    // ReactDOM.render(<h2>Hello World</h2>,document.getElementById('root'))

    // React18之后:createRoot
    const root = ReactDOM.createRoot(document.getElementById('root'))
    /* 
      要修改文本内容
      step1:将文本定义成变量
    */
    let message = 'Hello World'

    //step2:监听按钮的点击
    function btnClick() {
      // 2.1修改数据
      message = 'Hello React'

      // 2.2重新渲染界面
      rootRender()
    }

    rootRender()
    // step3.封装一个渲染函数
    function rootRender( ){
      // 第一个()表示方法;第二个()表示它是一个整体
      root.render((
        <div>
          <h1>{message}</h1>
          <button onClick={btnClick}>修改文本</button>
        </div>
      ))
    }
  </script>
</body>

案例-组件化开发

可使用类的方式,将其封装成一个组件

<body>
  <div id="root"></div>

  <script src="../lib/react.js"></script>
  <script src="../lib/react-dom.js"></script>
  <script src="../lib/babel.js"></script>
  <script type="text/babel">
    // 使用组件重构代码
    // 1.类组件-类名必须大写!!
    // 2.函数式组件
    class App extends React.Component {
      // 组件数据
      constructor() {
        super()

        //this.state = {定义的数据}
        this.state = {
          message:"Hello World"
        }
      }
      // 组件方法(实例方法)
      btnClick() {
        //该函数默认this指向为undefined——改变其this指向
        // 内部完成两件事:1.将state中的值修改掉  2.自动重新执行render函数
        this.setState({
          message:"Hello React"
        })
      }

      // render中返回的jsx内容即root根节点渲染内容
      render() {
        // console.log("render",this);//此处this-App组件实例
        return (
          <div>
            <h2>{this.state.message}</h2>
            <button onClick={this.btnClick.bind(this)}>修改文本</button>
          </div>
        )
      }
    }
    
    // 将组件渲染到界面上
    const root = ReactDOM.createRoot(document.getElementById('root'))
    root.render(<App />)
  </script>
</body>

JSX语法解析

jsx书写规范

render(){
  const {message} = this.state
  /* 
  书写规范:
  1.JSX结构中只有一个根元素
  2.JSX结构通常包裹一个()—— 将整个jsx当成一个整体,实现换行
  、3.jsx可以是单标签,也可以是双标签,但是单标签必须以/>结尾
  */
  return (
    <div>
      <h1>{ message }</h1>
      <br/>
    </div>
  )
}

jsx注释写法

render(){
  const {message} = this.state
  return (
    <div>
      {/* jsx注释写法 */}
      <h1>{ message }</h1>
    </div>
  )
}

jsx插入内容

<body>
  <div id="root"></div>

  <script src="../lib/react.js"></script>
  <script src="../lib/react-dom.js"></script>
  <script src="../lib/babel.js"></script>

  <script type="text/babel">
    //1.创建root
    const root = ReactDOM.createRoot(document.getElementById('root'))

    //2..定义App根组件
    class App extends React.Component {
      constructor() {
        super()

        this.state = {
          message:"Hello World",
          names:[ 'Jack', 'Tom', 'Lucy' ],
          count:100,

          aaa:undefined,
          bbb:null,
          ccc:true,

          friend:{name:'lucy', age:22},

          firstNmae:'张',
          lastName:'三',

          age:20,

          movies:["哪吒","唐探","三体"]
        }
      }

      render(){
        // 1.插入标识符
        const {message, names,count} = this.state
        const { aaa, bbb, ccc} = this.state
        const {friend} = this.state

        // 2.对内容进行运算后显示(插入表达式)
        const {firstNmae, lastName} = this.state
        const fullName = firstNmae + "" + lastName

        const {age} = this.state
        const ageStr = age > 18 ? '成年人' : '未成年人'
        const {movies} = this.state
        const items = movies.map(item => <li>{item}</li>)

        // 3.返回jsx的内容
        return (
          <div>
            {/* 1.Number/String/Array直接显示处理 */}
            <h1>{ message }</h1>
            <h2> {names} </h2>
            <h2> {count} </h2>

            {/* 2.undefined/null/Boolean页面什么都不显示-取值为空 */}
            <h2>{aaa}</h2>
            <h2>{bbb}</h2>
            <h3>{ccc}</h3>

            {/* 3.Object类型不能作为子元素显示 */}
            {/* <h2>{friend}</h2> */}
            <h2>{Object.keys(friend)}</h2>

            {/* 4.可插入对应的表达式 */}
            <h2>{ 10 + 20 }</h2>
            <h2>{firstNmae + "" + lastName}</h2>
            <h2>{fullName}</h2>

            {/* 5.插入三元运算符 */}
            <h2>{ageStr}</h2>
            <h2>{age >=18 ? "成年" : "未成年"}</h2>

            {/* 可以调用方法获取结果 */}
            <ul>{items}</ul>
            <ul>
              {movies.map(item => <li>{item}</li>)}
            </ul>
            <ul>{this.getMovies()}</ul>
          </div>
        )
      }

      getMovies(){
        const liEls = this.state.movies.map(item => <li>{item}</li>)
        return liEls
      }
    }

    // 3.将App组件渲染到root上
    root.render(<App />)
  </script>
</body>

jsx绑定属性

<body>
  <div id="root"></div>

  <script src="../lib/react.js"></script>
  <script src="../lib/react-dom.js"></script>
  <script src="../lib/babel.js"></script>

  <script type="text/babel">
    //1.创建root
    const root = ReactDOM.createRoot(document.getElementById('root'))

    //2..定义App根组件
    class App extends React.Component {
      constructor() {
        super()

        this.state = {
          title:"学习第一天",
          imgURL:"https://p1.ssl.qhmsg.com/t0143b426aee3bb03cb.jpg",
          link:"htttp://www.baidu.com",

          isActive:true,
          objStyle:{color:"red", fontSize:"30px"}
        }
      }

      render(){
        const {title, imgURL,link,isActive,objStyle} = this.state

        // 需求:isActive为true时,添加active类名
        // 写法一:
        const className = `abc cba ${isActive? "active" : ""}`
        // 写法二:
        const classList = ["abc","cba"]
        if(isActive) {
          classList.push("active")
        }
        return (
          <div>
            {/* 1.基本属性绑定 */}
            <h1 title={title}>我是h1元素</h1>
            {/* <img src={imgURL} alt=""/> */}
            <a href={link}>百度一下</a>

            {/* 2.绑定class属性 */}
            <h2 className={className}>哈哈哈哈哈</h2>
            <h2 className={classList.join(" ")}>哈哈哈哈哈</h2>

            {/* 3.绑定style属性:绑定对象类型 */}
            <h2 style={{color:"red", fontSize:"30px"}}>11111</h2>
            <h2 style= {objStyle}>888</h2>
          </div>
        )
      }
    }

    // 3.将App组件渲染到root上
    root.render(<App />)
  </script>
</body>

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

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

相关文章

【含文档+PPT+源码】基于Python的图书管理系统的设计与实现

项目介绍 本课程演示的是一款基于Python的图书管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项目附…

开源工具利器:Mermaid助力知识图谱可视化与分享

在现代 web 开发中&#xff0c;可视化工具对于展示流程、结构和数据关系至关重要。Mermaid 是一款强大的 JavaScript 工具&#xff0c;它使用基于 Markdown 的语法来呈现可定制的图表、图表和可视化。对于展示流程、结构和数据关系至关重要。通过简单的文本描述&#xff0c;你可…

茂捷M1001电感式编码器芯片TSSOP28管脚,国产电感式编码器IC

简述&#xff1a; M1001 电感式编码器芯片是一款专为高精度位置检测而设计的芯片产品&#xff0c;采用先进的电感技术&#xff0c;能够精确测量旋转物体的位置和角度。芯片具有 SIN/COS、模拟、PWM、SENT、SPI、I2C等多种角度输出功能&#xff0c;具有高分辨率、宽工作温度范围…

LeetCode-跳跃游戏 II

方法一&#xff1a;反向查找出发位置 我们的目标是到达数组的最后一个位置&#xff0c;因此我们可以考虑最后一步跳跃前所在的位置&#xff0c;该位置通过跳跃能够到达最后一个位置。 如果有多个位置通过跳跃都能够到达最后一个位置&#xff0c;那么我们应该如何进行选择呢&a…

数据结构——双向链表dlist

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——双向链表dlist 一 双向链表定义 1. 双向链表的节点结构 二 双向链表操作 2.1 定义 2.2 初始化 2.3 插入 2.3.1 头插 2.3.2 尾插 2.3.3 按位置插 2.4 删除 2.4.1 头删 2.4.2 尾删 2.4.3 按…

IDEA 一键完成:打包 + 推送 + 部署docker镜像

1、本方案要解决场景&#xff1f; 想直接通过本地 IDEA 将最新的代码部署到远程服务器上。 2、本方案适用于什么样的项目&#xff1f; 项目是一个 Spring Boot 的 Java 项目。项目用 maven 进行管理。项目的运行基于 docker 容器&#xff08;即项目将被打成 docker image&am…

图像分类数据集

《动手学深度学习》-3.5-学习笔记 # 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式&#xff0c; # 并除以255使得所有像素的数值均在0&#xff5e;1之间 trans transforms.ToTensor()#用于将图像数据从 PIL 图像格式&#xff08;Python Imaging Library&#xff…

设计模式之美

UML建模 统一建模语言&#xff08;UML&#xff09;是用来设计软件的可视化建模语言。它的语言特点是简单 统一 图形化 能表达软件设计中的动态与静态信息。 UML的分类 动态结构图&#xff1a; 类图 对象图 组件图 部署图 动态行为图&#xff1a; 状态图 活动图 时序图 协作…

2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 练习3-4 统计字符 本题要求编写程序&#xff0c;输入10个字符&#xff0c;统计其中英文字母、空格或回车、…

802.11标准

系列文章目录 文章目录 系列文章目录一、相关知识二、使用步骤1.802.11修正比较2.802.11ac 三、杂记 一、相关知识 跳频扩频&#xff1a;射频信号可分为窄带信号和扩频信号。如果射频信号的带宽大于承载数据所需的带宽&#xff0c;该信号就属于扩频信号。跳频扩频(FHSS)是一种…

母婴商城系统Springboot设计与实现

项目概述 《母婴商城系统Springboot》是一款基于Springboot框架开发的母婴类电商平台&#xff0c;旨在为母婴产品提供高效、便捷的在线购物体验。该系统功能全面&#xff0c;涵盖用户管理、商品分类、商品信息、商品资讯等核心模块&#xff0c;适合母婴电商企业或个人开发者快…

C#通过API接口返回流式响应内容---分块编码方式

1、背景 上一篇文章《C#通过API接口返回流式响应内容—SSE方式》阐述了通过SSE&#xff08;Server Send Event&#xff09;方式&#xff0c;由服务器端推送数据到浏览器。本篇是通过分块编码的方式实现 2、效果 3、具体代码 3.1 API端实现 [HttpGet] public async Task Chu…

游戏引擎学习第158天

回顾和今天的计划 我们在这里会实时编码一个完整的游戏&#xff0c;没有使用引擎或库&#xff0c;一切都由我们自己做所有的编程工作&#xff0c;游戏中的每一部分&#xff0c;无论需要做什么&#xff0c;我们都亲自实现&#xff0c;并展示如何完成这些任务。今天&#xff0c;…

[新能源]新能源汽车快充与慢充说明

接口示意图 慢充接口为交流充电口&#xff08;七孔&#xff09;&#xff0c;快充接口为直流充电口&#xff08;九孔&#xff09;。 引脚说明 上图给的是充电口的引脚图&#xff0c;充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…

在IDEA中连接达梦数据库:详细配置指南

达梦数据库&#xff08;DM Database&#xff09;作为国产关系型数据库的代表&#xff0c;广泛应用于企业级系统开发。本文将详细介绍如何在IntelliJ IDEA中配置并连接达梦数据库&#xff0c;助力开发者高效完成数据库开发工作。 准备工作 1. 下载达梦JDBC驱动 访问达梦官方资…

基于yolov8+streamlit实现目标检测系统带漂亮登录界面

【项目介绍】 基于YOLOv8和Streamlit实现的目标检测系统&#xff0c;结合了YOLOv8先进的目标检测能力与Streamlit快速构建交互式Web应用的优势&#xff0c;为用户提供了一个功能强大且操作简便的目标检测平台。该系统不仅具备高精度的目标检测功能&#xff0c;还拥有一个漂亮且…

软件性能测试与功能测试联系和区别

随着软件开发技术的迅猛发展&#xff0c;软件性能测试和功能测试成为了确保软件质量的两个重要环节。那么只有一字之差的性能测试和功能测试分别是什么?又有哪些联系和区别呢? 一、软件性能测试是什么?   软件性能测试是为了评估软件系统在特定条件下的表现&#xff0c;包…

Axure设计之堆叠柱状图教程(中继器)

堆叠柱状图是一种常用的数据可视化工具&#xff0c;它通过在同一柱状图内堆叠不同类别的数据&#xff0c;以展示每个类别在总体中的贡献或占比。堆叠柱状图不仅可以帮助我们观察数据的总量&#xff0c;还能清晰地揭示各部分之间的关系和变化趋势。以下是一个使用Axure制作动态效…

本地部署Hive集群

规划 服务机器Hive本体部署在Node1元数据服务所需的关系型数据库(MYSQL)部署在Node1 安装MYSQL数据库 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

零成本本地化搭建开源AI神器LocalAI支持CPU推理运行部署方案

文章目录 前言1. Docker部署2. 简单使用演示3. 安装cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 嘿&#xff0c;小伙伴们&#xff01;今天给大家带来一个超酷的黑科技——LocalAI。没错&#xff0c;你没听错&#xff0c;就是那个能在你的个人电脑上运行大型语言模…