【React】React入门(一)--React的创建、Jsx语法与组件以及状态(state)

news2024/9/22 1:40:13

🎀个人主页:努力学习前端知识的小羊
感谢你们的支持:收藏🎄 点赞🍬 加关注🪐

文章目录

    • React简介
      • react的特性
      • 虚拟Dom
        • 传统dom更新
        • 虚拟Dom
    • create-react-app
    • JSX语法与组件
      • jsx语法
      • class组件
      • 函数组件
      • 组件嵌套
      • 组件的样式
      • 事件绑定
      • ref应用
    • 数据的数据挂载方式
      • 状态(state)
      • 循环渲染

React简介

react简单来说,就是把界面分成了各个独立的小块,每一个块就是组件,这些组件之间可以组合、嵌套,就成了我们的界面。

react的特性

  • 声明式设计–react采用声明范式,可以轻松描述应用
  • 高效–react通过对DOm的模拟(虚拟Dom),最大限度地减少与Dom的交互
  • 灵活–react可以与已知的库或框架很好的配合
  • JSX--JSX是Javascript语法的扩展
  • 组件–通过react构建组件,使得代码更加容易得到复用,能够更好的应用在大项目的开发中
  • 单响应的数据流-react实现了单向响应的数据流,从而减少了重复代码,这也是为什么他比传统数据绑定更简单

虚拟Dom

传统dom更新

真实页面对应一个Dom树。在传统页面的开发模式中,每次需要更新页面时,都要手动操作来进行更新

虚拟Dom

Dom操作非常昂贵。在前端开发中,性能消耗最大的就是Dom操作,而且这部分代码会让整体项目的代码变得难以维护。react把真实Dom树转换成JavaScript对象树,也就是Virtual
Dom

create-react-app

全局安装create-react-app

$ npm install -g create-react-app

创建一个项目

$ creat-react-app project-name

如果不想全局安装,可以直接使用npx

$ npx create-react-app project-name  也可以实现相同的效果

在等待的过程,安装的三个东西

  • react:react的顶级库
  • react-dom:因为react有很多的运行环境,比如app端的react-native,我们在web上运行就使用react-dom
  • react-scripts:包含运行和打包应用程序的所有脚本及配置

当出现下方界面,表示创建项目成功

(https://img-blog.csdnimg.cn/f7ff5559ed154045af495f23be1523f1.png)

生成目录结构如下:
在这里插入图片描述

JSX语法与组件

jsx语法

jsx == js + xml

jsx将Html语法加入到JavaScript中,再通过翻译器转换到纯JavaScript后由浏览器执行

class组件

app组件内

import React from "react";
class App extends React.Component{
    render(){
        return (
            <section>
            <div>
                hello react Component
                <ul>
                    <li>111</li>
                    <li>2222</li>
                </ul>
            </div>
            <div>新的内容</div>
        </section>
        )
            

    }
}

export default App

index.js内

import React from 'react';
import ReactDOM from 'react-dom'
import App from './01-class组件';
import { createRoot } from 'react-dom/client'

const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App></App>)

函数组件

函数组件内,导出一个函数

function App(){
    return (
        <div>
            hello react Component
            <ul>
                <li>111</li>
                <li>2222</li>
            </ul>
        </div>
    )
}

export default App

index.js内

import React from 'react';
import ReactDOM from 'react-dom'
import App from './01-class组件';
import { createRoot } from 'react-dom/client'

const container = document.getElementById('root')
const root = createRoot(container)
root.render(<App></App>)

组件嵌套

import React,{ Component} from 'react'

class Child extends Component{
    render(){
        return <div>child</div>
    }
}
class Navbar extends Component{
    render(){
        return <div>Navbar
            <Child></Child>
        </div>
    }
}
function Swiper(){
    return <div>swiper</div>
}

const Tabbar = ()=> {
    <div>tabbar</div>
}
export default class App extends React.Component{
    render() {
        return (
            <div>
                <Navbar>
                </Navbar>
                <Swiper></Swiper>
                <Tabbar></Tabbar>
            </div>
        )
    }
}

组件的样式

  • 内部样式
import React, { Component } from 'react'
export default class App extends Component {
  render() {
    var myname = 'ssss'
    var obj ={
        background:"yellow",
        color:"blue",
        fontSize:"30px"
    }
    return (
      <div>
        {10+20} + {myname}
        {10>20?'aaa':'bbb'}
        <div style={obj}>222222222222</div>
		// 行内样式:双重大括号
        <div style={{background:'red'}}>111111111111</div>
        <label htmlFor='username'>用户名:</label>
        <input type="text" id="username" />
      </div>
    )
  }
}

  • 引用外部样式

外部样式01-index.css

.active{
    background-color: aquamarine;
    color: cadetblue;
    font-size: 20px;
}
#myapp{
    background-color: aqua;
}

在js文件引入外部样式

import React, { Component } from 'react'
import './css/01-index.css'
export default class App extends Component {
  render() {
    var myname = 'ssss'
    var obj ={
        background:"yellow",
        color:"blue",
        fontSize:"30px"
    }
    return (
      <div>
        {10+20} + {myname}
        {10>20?'aaa':'bbb'}
    
        <div className="active">
            3333333333333
        </div>
        <div id='myapp'>5555555</div>

        <label htmlFor='username'>用户名:</label>
        <input type="text" id="username" />
      </div>
    )
  }
}

注: React推荐我们使用行内样式,因为React觉得每一个组件都是一个独立的整体

事件绑定

  • 直接在render中使用箭头函数
import React, { Component } from 'react'

export default class App extends Component {
    a = 100;
  render() {
    return (
      <div>
        <input />
        <button onClick={ ()=>{
            console.log("click1",this.a,"如果处理逻辑过多,不推荐使用");
        }}>add1</button>
      </div>
    )
  }
}

注:render中的this指的就是App组件,故能获取this.a

  • 在组件中定义一个方法,在render中调用

    import React, { Component } from 'react'
    
    export default class App extends Component {
        a = 100;
      render() {
        return (
          <div>
            <input />
          {/* bind解决this指向   不推荐使用*/}  
            <button onClick={this.handleClick2.bind(this)}>add2</button>
            {/*推荐使用*/}
    		<button onClick={this.handleClick3}>add3</button> 
          </div>
        )
      }
    // 定义一个函数
      handleClick2(){
        console.log("click2"this.a);
      }
    //定义一个箭头函数
      handleClick3 = ()=>{
        console.log("cliak3",this.a);
      }
    }
    

补充:call与apply与bind的区别

call:改变this,自动执行函数

apply改变this,自动执行函数

bind: 改变this,不自动执行函数,手动加()执行函数

  • 组件中定义一个方法,在render中采用箭头函数调用方法

    import React, { Component } from 'react'
    
    export default class App extends Component {
        a = 100;
      render() {
        return (
          <div>
            <input />
            <button onClick={()=>{
                this.handleClick4()
            }}>add4</button>
          </div>
        )
      }
      handleClick4 = ()=>{
        console.log("cliak4",this.a);
      }
    }
    
    

    ref应用

  • 给标签设置ref属性:获取input的value值,绑定input的ref属性获取

    <div>
        <input ref = "mytext" />
        <button onClick = {()=>{
            // refs已经被淘汰不建议这样写
            console.log("click",this.refs.mytext.value)
        }}>
    </div>
    
  • 新的写法(严格写法):

    myref = React.createRef()
      render() {
        return (
          <div>
            <input ref={this.myref}/>
            <button onClick={ ()=>{
                console.log("click",this.myref.current.value);
            }}>add1</button>
          </div>
        )
      }
    

数据的数据挂载方式

状态(state)

状态就是组件描述某种显示情况的数据,由组件自己设置和更改,也就是说由组件自己维护,使用状态的目的就是为了在不同的状态下使组件的显示不同(自己管理)

  • 在App组件中设置state属性,render中改变state

    export default class App extends Component {
        a = 1;
        state = {
            mytext:"收藏"
        }
      render() {
        return (
          <div>
            <h1>欢迎来到React开发-{this.state.myname}</h1>
            <button onClick={()=>{
                this.state.mytext="取消"
            }}>{this.state.mytext}</button>
          </div>
        )
      }
    }
    
    
  • 利用constructor属性添加state

    export default class App extends Component {
        constructor(){
            super()
            this.state = {
                mytext:"收藏",
                myshow:true,
                myname:"kerwin"
            }
        }
      render() {
        return (
          <div>
            <h1>欢迎来到React开发-{this.state.myname}</h1>
            <button onClick={()=>{
                this.setState({
                    myshow:!this.state.myshow,
                    myname:"xiaoming"
                  
                }) //间接修改收藏
            
            	//修改逻辑
                if(this.state.myshow){
                    console.log("收藏的逻辑");
                } else{
                    console.log("取消收藏的逻辑");
                }
    
            }}>{this.state.myshow?"收藏":"取消收藏"}</button>
          </div>
        )
      }
    }
    

循环渲染

利用map

  • 原生js实现

    var list = ['aa',"bb","cc"]
    
    var newlist = list.map(item=>`<li>${item}</li>`)
    
    console.log(newlist.join(""));
    
  • react中利用map在render中实现

    export default class App extends Component {
    
        state = {
            list:[{
              id:1,
              text:"11"},
              {
                id:2,
                text:"22"},
              {
                id:3,
                text:"33"}
            ]
        }
      render() {
        return (
          <div>
            <ul>
                {
                    this.state.list.map(item=>
                        <li key={item.id}>{item.text}</li>)
                }
            </ul>
          </div>
        )
      }
    }
    或者
    render(){
        var newlist = this.state.list.map(item=><li key={item.id}>{item.text}</li>)
    	return (
        	<div>
            	<ul>
            		{ newlist }
            	</ul>
            </div>
        )
    }
    

    注: 设置key值,是为了列表的复用和重排,提高性能,理想key值:item.id,不涉及到列表的增加或删除,重排,设置成索引值也可以

🎆🎆希望对大家有所帮助,期待你们的支持✨✨✨

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

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

相关文章

基于Springboot搭建java项目(三十六)—— 服务监控工具WGCLOUD

服务监控工具WGCLOUD 一、服务监控 ​ “要想晚上睡的好&#xff0c;服务监控少不了”&#xff0c;服务器监控是应用程序开发中必不可少的一部分&#xff0c;做好服务监控有以下几个优点&#xff1a; 能够及时发现应用程序的漏洞能够定位到程序运行的瓶颈&#xff0c;查看程…

一篇搞懂SQL

前言 根据廖雪峰老师的教程&#xff0c;整理出一篇文章 一&#xff0c;为什么需要数据库&#xff1f; 小量的数据可以使用excel或者cvs存储&#xff0c;但是大批量的数据&#xff0c;这些都无法满足需求。如何管理这些数据就成了大问题。 所以&#xff0c;数据库作为一种专门…

机器视觉_HALCON_HDevelop用户指南_5.HDevelop过程(打磨ing)

文章目录五、HDevelop过程5.1. 过程类型5.2. 文件类型5.2.1. HDevelop程序5.2.2. 过程文件5.2.3. 库5.3. 过程作用域5.4. 过程位置5.5. 过程解析5.6. 受保护的过程5.7. 过程文档5.8. 即时编译&#x1f53a;五、HDevelop过程 Procedure&#xff1a; 在HDevelop文档中&#xff08…

【PyTorch】ImageNet数据集的使用和miniImageNet的构建

【PyTorch】ImageNet的使用和miniImageNet的构建1. ImageNet下载和简介1.1 下载地址1.2 初步处理1.3 devkit介绍2. miniImageNet2.1 miniImageNet的划分3. 使用ImageFolder构建数据集类3.1 重写DataFolder中的方法3.2 BatchSampler实现episode采样3.3 batch可视化1. ImageNet下…

Oracle数据库入门大全

oracle数据库 Oracle 数据库、实例、用户、表空间、表之间的关系 数据库 数据库是数据集合。Oracle是一种数据库管理系统&#xff0c;是一种关系型的数据库管理系统。 通常情况了我们称的“数据库”&#xff0c;并不仅指物理的数据集合&#xff0c;他包含物理数据、数据库管理…

let/const相关内容(五)

1.块级作用域的应用 &#xff08;一&#xff09;if-switch-for代码中的应用 ① if语句的代码就是块级作用域 // if语句的代码块是块级作用域 if (true) {var foo "foo"let bar "bar" }console.log(foo) console.log(bar);② switch语句的代码也是块级…

SQL面试题62--一种准确求近30天消费金额的方法

1 需求现在test表有三个字段 用户&#xff1a; user_id 日期&#xff1a;dt 订单金额 price&#xff0c;计算出一个消费者历史上“首次”在近30天周期内累计消费金额达到1W的日期2 分析&#xff08;1&#xff09;数据准备create table test as select a as user_id,7000 as pri…

数据分析很火吗?千万不要轻易尝试!

据说数据分析现在很火&#xff1f;“现在是数字化时代&#xff0c;工作生活都是与互联网交织在一起&#xff0c;我们的生活习惯、兴趣爱好等都会演变成各种不同的数据被互联网收集存储&#xff08;云存储&#xff09;。作为个人而言这些数据单看的话是没有什么价值和意义的&…

安全卫“视”!昂视助力极片卷绕对齐度检测

价格大涨、产能扩充、加速融资、加快出海、与车企深度绑定&#xff0c;动力电池产业在2022年表现出了极高的市场活力&#xff0c;在疫情的大环境之下&#xff0c;其发展势头是业内外公认的“高亢”。全国乘用车市场信息联席会预计&#xff0c;2023年新能源乘用车销量有望达850万…

SCI论文阅读-深度学习在测井气体红外光谱定量分析中的应用

期刊&#xff1a; Applied Optics中科院最新分区&#xff08;2022年12月最新版&#xff09;&#xff1a;4区影响因子&#xff08;2021-2022&#xff09;&#xff1a;1.905第一作者&#xff1a;宋丽梅通讯作者&#xff1a;Yangang Yang原文链接&#xff1a;Application of deep …

一文弄懂什么是对比学习(Contrastive Learning)

本文是自己学习对比学习的总结&#xff0c;如有问题&#xff0c;欢迎批评指正。 前言 有的paper将对比学习称为自监督学习&#xff08;Self-supervised learning&#xff09;&#xff0c;有的将其称为无监督学习&#xff08;Unsupervised Learning , UL&#xff09;。自监督学…

spring事务执行流程分析_6(事务的真正执行)

代理对象的执行 执行案例中的bookService.addUser(user);会调用到JdkDynamicAopProxy#invoke方法 JdkDynamicAopProxy#invoke public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Object oldProxy null;boolean setProxyContext false;…

2023年黑马Java入门到精通教程--编程思维训练

编程案例分享 编程思维 使用所学的Java技术解决问题的思维方式和编写代码实现出来的能力。 关于提升编程思维和编程能力的建议 编程思维和编程能力不是一朝一夕形成的&#xff0c;需要时间的沉淀和大量练习。 前期&#xff1a;先模仿&#xff0c;后期&#xff1a;再创新。…

为游戏玩家提供卓越价值,英特尔锐炫游戏性能大幅提升!

2月1日晚英特尔推出锐炫显卡新版驱动(4086)&#xff0c;相较此前驱动(3490)能够为DirectX 9游戏带来40%以上的平均性能提升。同时英特尔还宣布&#xff0c;现在起锐炫A750限量版显卡的全球价格将调整为249美元&#xff0c;此前上市价格为289美元起。 在英特尔发布锐炫显卡后&…

HTML5+CSS3(五)-全面详解(学习总结---从入门到深化)

目录 容器元素&#xff08;div&#xff09; 学习效果反馈 HTML5新增布局标签 学习效果反馈 视频和音频 视频 音频 source 学习效果反馈 HTML5新增标签 figure details mark meter datalist canvas 学习效果反馈 容器元素&#xff08;div&#xff09; <!DOCTYPE h…

k8s核心资源存储对象

一、简介 和docker类似&#xff0c;k8s也需要存储数据&#xff0c;比如redis和mysql都需要外部存储对象&#xff0c;要不然重新拉起pod&#xff0c;在其他机器上数据会消失。 二、NFS共享存储 NFS这个文件系统提供了远程挂载共享数据&#xff0c;我们可以利用这个文件系统来…

ASEMI整流模块MDA300-16封装,MDA300-16大小

编辑-Z ASEMI整流模块MDA300-16参数&#xff1a; 型号&#xff1a;MDA300-16 最大重复峰值反向电压&#xff08;VRRM&#xff09;&#xff1a;1600V 最大RMS电桥输入电压&#xff08;VRMS&#xff09;&#xff1a;1700V 最大平均正向整流输出电流&#xff08;IF&#xff0…

408计组巅峰之路:总线技术、总线仲裁

文章目录总线概念总线的基本概述总线分类标准①按数据传输格式②按总线功能&#xff08;连接的部件&#xff09;③按时序控制方式微机总线&#xff08;补充&#xff09;性能指标典型的计算机总线1.个人计算机总线测控机箱底板总线仪器与计算机互联总线PCI 总线局部总线1.PCI总线…

单片机复位详解

复位&#xff08;stm32f407ZGT6&#xff09;-属于中断操作共有三种类型的复位&#xff0c;分别为系统复位、电源复位和备份域复位。系统复位除了时钟控制寄存器 CSR 中的复位标志和备份域中的寄存器外&#xff0c;系统复位会将其它全部寄 存器都复位为复位值。只要发生以下事件…

纹理贴图原理与实践【图形学基础】

纹理贴图是 20世纪90 年代 CG 的主要创新之一。 它允许我们在不添加大量几何基元&#xff08;线、顶点、面&#xff09;的情况下添加大量表面细节。 想一想 Caroline 的 loadedDemo 的所有纹理映射是多么有趣&#xff1a; 推荐&#xff1a;使用 NSDT场景编辑器 快速搭建 3D场景…