React框架入门

news2024/11/17 3:51:29

        React是用于构建用户界面的JavaScript库, 起源于Facebook的内部项目,该公司对市场上所有 JavaScript MVC框架都不满意,决定自行开发一套,用于架设Instagram的网站。于2013年5月开源       

一、React简介

        React以声明式编写 UI,可以让代码更加可靠,且方便调试;创建拥有各自状态的组件,再由这些组件构成更加复杂的 UI。

        CS 与 BS结合:像 React,Vue 此类框架,转移了部分服务器的功能到客户端。将CS 和 BS 加以结合。客户端只用请求一次服务器,服务器就将所有js代码返回给客户端,所有交互类操作都不再依赖服务器。 客户端只有在需要服务器的数据时才会使用json通信一下,其他时间都在客户端利用js操作、暂存数据这样就极大减轻了服务器压力。

1.1 React特点

1. 声明式变成

        React 使创建交互式 UI 变得轻而易举。为应用的每一个状态设计简洁的视图,当数据改变时 React 能有效地更新并正确地渲染组件。

2. 组件化思维

        组件逻辑使用 JavaScript 编写而非模板,因此可以轻松地在应用中传递数据,并使得状态与 DOM 分离。

3. 编写方便

        无论你现在正在使用什么技术栈,你都可以随时引入 React 来开发新特性,而不需要重写现有代码。React 还可以使用 Node 进行服务器渲染,或使用 React Native 开发原生移动应用。

1.2 JXL语法

        为了构建交互式用户界面,使用了 JSX。JSX 的完整版本是一个JavaScript语法扩展,它极大地简化了组件的创建。它支持HTML引用并使子组件渲染更容易。它本质上是一组 React 编写快捷方式。使用带有一些规则的 createElement 可以使源代码更具可读性和直接性。首先写jsx文件,运行时会先将所编写的jsx编译为js,编译完之后,将js文件运行在浏览器。

二、安装并创建项目

        在使用React之前,先确保你已经安装了node.js,后续过程都是在node环境下运行的。使用window+R,输入cmd,回车。

1. npm i -g create-react-app  安装React

2. creat-react-app 项目名称(myreact)   创建项目

3. cd /myreact  进入到项目

4. npm start 运行项目

三、项目文件结构

四、React语法

4.1 JSX语法

        html与js混写的语法 JavaScript和XML的混写,需要编译器编译才能被浏览器执行。特点js书写html模板方便;比较接近原生,编译较快。

1. {}写js表达式;

2. {/*注释内容 */} 注释;

3. 数组里面可以包含html标签;

4. 类似于vue2,有且仅有一个根节点;

5. 类名要用className;

6. 样式style会自动展开。

具体代码如下:

App.js 

import './App.css'
const styles = {
  fontSize: "48px",
  color: "#770",
  fontWeight: 900
}
function App() {
  var msg = "中国香港是他主持回归的";
  var list = [
    <h2>A</h2>,
    <h2>B</h2>,
    <h2>C</h2>
  ]
  return (<div>
    <h1 className="active">你好,react</h1>
    <p style={styles}>{msg}</p>
    {/* <p>{8 > 5 ? "可大了" : "太小了"}</p> */}
    {list}
  </div>)
}
export default App;

App.css

.active {
  color: #f70;
}

4.2 内容渲染

1. 文本渲染:将内容直接写在{}内;内容中如果包含html标签也可以被渲染,需要添加dangerouslySetInnerHTML。

function App() {
  let msg = "你好中国react!"
  let text = "2023年还有<strong>一个月</strong>就到了"
  return (
    <div>
      <h1>模板语法</h1>
      <h2>文本渲染</h2>
      <p>{msg}</p>
      <p dangerouslySetInnerHTML={{ __html: text }}></p>
    </div>
  )
}
export default App;

2. 列表渲染: 通过map映射来渲染,如果是字符串,可以先通过split分割成数据再渲染。

function App() {
  let msg = "你好中国react!"
  let list = ["vue", "react", "uni-app", "小程序"]
  return (
    <div>
      <h1>模板语法</h1>
      <h2>列表渲染</h2>
      {
        list.map((item, index) => <h4 key={index}>{item}</h4>)
      }
      <div>
        {msg.split("").map((item, ind) => <p key={ind}>{item}</p>)}
      </div>
    </div>
  )
}
export default App;

 3. 条件渲染:有两种方式,使用三元运算符进行判断;使用&&来判断。

function App() {
  let flag = true
  let isLog = true
  return (
    <div>
      <h1>模板语法</h1>
      <h2>条件渲染</h2>
      {flag ? <p>成功</p> : <p>失败</p>}
      {isLog && <p>欢迎回来</p>}
    </div>
  )
}
export default App

 4.3 事件响应函数

        事件响应有两种方式:使用箭头函数onClick={()=>{相应内容}};使用this, onClick={this.say},say为自定义函数。

        函数传参也有两种方式:匿名函数 onClick={()=>this.say(参数)}或者onClick={this.say.bind(this,参数)}。

 4.4 组件

 1. 函数组件:负责展示,也称为视图组件。

function Demo() {
    return (  );
}

export default Demo;

2. 类组件:负责处理数据,也称为容器组件。类组件包含state、生命周期、props、this等。

class Demo extends Component {
    constructor(props) {
        super(props);
    }
    state = {  }
    render() { 
        return (  );
    }
}
 
export default Demo;

 4.5 组件传参

1.父组件向子组件传参,通过props属性方式。

2.  子组件向父组件传参,通过props回调函数方式。

 3. 默认props及唯一的插槽

五、React生命周期 

        React组件在从创建到销毁会经历一系列过程,在这些过程执行回调函数,称为生命周期钩子函数。React的生命周期仅存在与类组件中;函数组件中没有生命周期的概念,但可以使用Hooks模拟生命周期。

5.1 挂载

1. constructor:初始化state;

2. static getDerivedStateFromProps:props更新触发state更新(要求返回一个新的state) nextProps最新的props;

3. render渲染;

4. componentDidMount(重要) 组件已经挂载;作用:监听事件、开启定时器、ajax请求,dom操作。

import React, { Component } from 'react';
class Life extends Component {
    constructor(props) {
        super(props);
        console.log("挂载-01-constructor")
    }
    static getDerivedStateFromProps(nextProps, prevState) {
        //当props发送变化时候更新state
        console.log("挂载-02-getDerivedStateFromProps");
        return ({})
    }
    state = { num: 5 }
    render() {
        console.log("更新-03-render渲染")
        return (<div>
            <h1>生命周期</h1>
            <button onClick={() => this.setState({ num: this.state.num + 1 })}>{this.state.num}</button>
        </div>);
    }
    componentDidMount() {
        // console.log("挂载-04-componentDidMount")
    }
}

export default Life;

5.2 更新

1. static getDerivedStateFromProps props更新触发state更新(要求返回一个新的state) nextProps最新的props ;

2. houldComponentUpdate 组件是否更新,作用优化组件的渲染 返回true更新 false停止更新 常用于组件的优化;

3. render组件重新的渲染;

4. getSnapshotBeforeUpdate 更新前获取快照,返回值是cdu的第三个参数;

5. componentDidUpdate组件已经更新。

import React, { Component } from 'react';
class Life extends Component {
    constructor(props) {
        super(props);
        console.log("挂载-01-constructor")
    }
    static getDerivedStateFromProps(nextProps, prevState) {
        //当props发送变化时候更新state
        console.log("更新-01-getDerivedStateFromProps");
        return ({})
    }
    shouldComponentUpdate(nextProps, nextState) {
        //组件是否需要更新(组件优化)
        console.log("更新-02-shouldComponentUpdate")
        return true
    }
    state = { num: 5 }
    getSnapshotBeforeUpdate(prevProps, prevState) {
        //组件更新前获取快照,返回的数据是cdu的第三个参数
        console.log("更新-04-getSnapshotBeforeUpdate");
        return { name: "mumu", age: 18 }
    }
    componentDidUpdate(prevProps, prevState, snapshot) {
        //组件已完成更新
        console.log("更新-05-componentDidUpdate", snapshot)
    }
    render() {
        console.log("更新-03-render渲染")
        return (<div>
            <h1>生命周期</h1>
            <button onClick={() => this.setState({ num: this.state.num + 1 })}>{this.state.num}</button>
        </div>);
    }
}

5.3 卸载

        componentWillUnmount 组件将要卸载 作用:移除DOM事件,监听定时器。

六、Hooks

        函数组件只有props,react17 更新一个hooks让函数组件拥有类似state与生命周期。

6.1 useState模拟状态

        const [num,setNum]=useState(5)

代码解读:模拟num数据默认是5,模拟更新num的方法setNum。

6.2 useEffect使用副作用

        注意以下箭头函数中的第二个参数,区别都在这个上面。

1. 模拟生命周期componentDidMount,代码:useEffect(()=>{console.log("componentDidMount")},[]);

2. 模拟生命周期componentDidUpdate,代码:useEffect(()=>{console.log("num更新触发回调函数")},[num]);

3. 模拟生命周期componentWillUnmount,代码:useEffect(()=>{console.log("模拟生命周期componentWillUnmount")},[]);

4. 任意数据的更新,挂载,卸载都会触发,代码:useEffect(()=>{console.log("任意数据更新,挂载,卸载都会触发")})

/src/App.js

import { useEffect, useState } from 'react';
import Test from './components/test'
function App() {
  //创建一个state  num默认值是5,同时定义设置num的方法
  const [num, setNum] = useState(5);
  const [count, setCount] = useState(100);
  useEffect(() => {
    //模拟生命周期的componentDidMount
    console.log("回调函数模拟cmd")
  }, [])
  useEffect(() => {
    //模拟生命周期的componentDidUpdate
    console.log("回调函数模拟num的更新")
  }, [num, count])
  return (<div>
    <h1>hooks</h1>
    <p>函数组件拥有模拟生命周期,模拟state,模拟ref的能力</p>
    <button onClick={() => setNum(num + 1)}>{num}</button>
    <button onClick={() => setCount(count + 5)}>{count}</button>
    {num < 10 ? <Test></Test> : ""}
  </div>);
}

export default App;

/src/components/test.js

import { useEffect, useState } from 'react';

function Test() {
    const [n, setN] = useState(4);
    useEffect(() => {
        //返回函数模拟的卸载
        return () => console.log("组件将要被卸载")
    }, [])
    return (<div>
        生命周期的卸载
        <button onClick={() => setN(n + 2)}>{n}</button>
    </div>);
}

export default Test;

       掌握以上的基础知识,写一个官网上的井字游戏体验React的奇妙之处是不成问题了,赶紧去去试试吧!

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

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

相关文章

0119 动态规划 Day8

剑指 Offer 10- I. 斐波那契数列 写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项&#xff08;即 F(N)&#xff09;。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1 F(N) F(N - 1) F(N - 2), 其中 N > 1…

计算机的硬件系统和软件系统的关系

计算机的硬件系统和软件系统的关系是缺一不可。 硬件它是所有软件运行的物质基础。 与硬件直接接触的是操作系统&#xff0c;它处在硬件和其他软件之间&#xff0c;表示它向下控制硬件&#xff0c;向上支持其他软件。 在操作系统之外的各层分别是各种语言处理程序、数据库管理…

CleanMyMacX4.12.1Crack版本频繁弹密码 菜单浮窗无法显示显示空白解决办法

你们有没有出现过在使用 CleanMyMac 清理系统垃圾文件的时候会频繁弹出输入开机密码&#xff1f;那么该如何解决这个问题呢&#xff1f;跟着小编来看看解决方法吧&#xff01; 频繁输入密码 更新CleanMyMacX到4.12.1的Crack版本之后&#xff0c;发现做一些操作要一直输入密码&…

科技云报道:PingCAP黄东旭:Serverless是数据库的未来形态

科技云报道原创。 30年前&#xff0c;程序员要想写代码&#xff0c;必须使用复杂的汇编语言。 但在今天&#xff0c;几乎没有程序员知道如何使用汇编语言&#xff0c;更加简易的高级语言如C&#xff0c;C#&#xff0c;JAVA&#xff0c;Rust&#xff0c;Go已成为开发主流。 随…

分布式文件存储系统FastDFS[3]-通过Docker安装并且从客户端进行上传下载测试

一、FastDFS安装 FastDFS的安装我们还是通过Docker来安装实现吧&#xff0c;直接在Linux上还装还是比较繁琐的&#xff0c;但就学习而言Docker安装还是非常高效的。Docker环境请自行安装哦&#xff0c;不清楚的可以看看我的Docker专题的内容。https://blog.csdn.net/qq_3852657…

【jenkins】1. 安装jenkins (docker-compose)

环境 ubuntu 20docker服务器 ip:xxx.xxx.xxx.xxx 步骤 1. 【编写安装文件】windows下 - 编写 docker-compose.yaml version: "3.1" services:jenkins:image: jenkins/jenkinsrestart: alwayscontainer_name: jenkinsports:- 58080:8080- 50000:50000volumes:- ./…

5.31 综合案例2.0 - 在线MP3音乐播放器

综合案例2.0 - 在线MP3音乐播放器一、案例说明二、准备器件三、案例连线四、代码代码说明复制五、测试一、案例说明 本案例制作一个联网下载声音文件的MP3播放器。 案例功能说明&#xff1a; 案例使用一块IC035串口屏和两个按键通过按键可以切换音乐&#xff0c;下载播放或删除…

瑜岿科技综合能源管理系统助力企业节能降耗工作

能源是国民经济的基础&#xff0c;更是城市赖以发展的动力。优化能源结构、大力发展可再生能源、提高机房能效、实现建筑智慧节能是行业绿色发展重点。在国家碳达峰碳中和的重大战略决策背景下&#xff0c;我国能源体制改革深入推进&#xff0c;能源生产和消费发生重大变革&…

如今社交电商不可忽略的一个点——消费增值

消费增值是一个基于消费返利理论的全新商业消费生态&#xff0c;一个让用户从优惠消费—免单消费—挣钱消费&#xff0c;所突破的新消费、新业态模式—增值消费&#xff0c;一个从电商化的平台走向品牌化的平台&#xff0c;让平台脱离单打独斗的方式&#xff0c;通过商家联盟方…

编译原理 2 - 词法分析

第3章 词法分析3.1 词法分析器的功能和结构3.2 状态转换图3.3 正则文法 和 正则表达式3.4 有限自动机 DFA与NFA测试第3章 词法分析 重点&#xff1a;① 词法分析器的输入、输出&#xff1b;② 用于识别符号的状态转移图的构造&#xff1b;③ 根据状态转移图实现词法分析器 难点…

【MATLAB教程案例55】GoogleNet网络的MATLAB编程学习和实现,以步态识别为例进行仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.GoogleNet理论概述

基于Qt的桌面客户端组件化框架DT 开源啦

这个是本人在工作中基于QT开发的组件化桌面开发框架&#xff0c;目前打算开源出来提供给大家&#xff0c;节省大家的开发时间和效率&#xff0c;希望对大家的开发有所帮助&#xff0c;也欢迎提出意见和改进建议 1. 为什么开源DT框架 DT框架&#xff0c;本身就是基于QT为基础搭…

深度学习——含并行连接的网络(GoogLeNet)笔记

GoogLeNet中基本的卷积块是Inception块。 1.Inception块&#xff1a;4个路径从不同的层面抽取信息&#xff0c;然后在输出通道合并 ①1*1的卷积层&#xff0c;减少通道数&#xff0c;降低模型的复杂度 ② 1*1的卷积层&#xff0c;减少通道数&#xff0c;降低模型复杂度。然后…

volatile关键字和synchronized关键字

参考博客&#xff1a;https://www.cnblogs.com/cg-ww/p/14540450.html 1、volatile的作用&#xff1a;关键作用是使变量在多个线程之间可见 程序并没有因为我修改之后结束运行&#xff0c;因为线程对共享变量具有不可见性&#xff0c;main线程修改布尔值之后&#xff0c;子线…

【读点论文】MicroNet: Towards Image Recognition with Extremely Low FLOPs,在极高限制下的轻量化网络

MicroNet: Towards Image Recognition with Extremely Low FLOPs Abstract 这篇论文旨在以极低的计算成本解决性能大幅下降的问题。提出了微分解卷积&#xff0c;将卷积矩阵分解为低秩矩阵&#xff0c;将稀疏连接整合到卷积中。 提出了一个新的动态激活函数-- Dynamic Shift …

精准管控 | AIRIOT数字油库智能化解决方案

在油库管理的过程中&#xff0c;储油罐区普遍存在分布空间范围广、安全防爆要求高、监控点多、布线复杂、自动化系统集成难度大等问题&#xff0c;传统的油库管理手段相对落后、管理环境复杂&#xff0c;企业在监测监控、设备设施管理、日常运行等方面存在诸多难点&#xff1a;…

Openldap2.5.13编译安装

Openldap2.5.13编译安装 本篇文章没有很全面&#xff0c;采用的是编译安装&#xff0c;yum安装参考我的另外一篇文章 一、准备 openssl-1.1.1.tar.gz 下载地址&#xff1a;https://ftp.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz openldap-2.5.13.tgz 下载地址&#…

APS计划排产软件在仪器仪表行业的应用

仪器仪表是指用以产生、测量精密量的设备和装置&#xff0c;包括对精密量的观察、监视、测定、验证、记录、传输、变换、显示、分析处理与控制。仪器仪表是仪器仪表的一个重要分支。伴随国家出台政策大力发展精密仪器仪表下游行业&#xff0c;下游应用领域对精密仪器仪表的需求…

React 学习笔记:组件生命周期

组件生命周期 生命周期一个事物从创建到最后消亡经历的过程&#xff0c;在这个过程中会有不同的状态&#xff08;新生儿、少年&#xff09;&#xff0c;所以在 16.8 版本以前生命周期只有类组件才有&#xff0c;函数组件是没有这个概念的&#xff0c;因为它没有状态&#xff0…

Diffusion-LM Improves Controllable Text Generation 扩散语言模型改善可控文本生成

论文链接&#xff1a;https://arxiv.org/abs/2205.14217 代码链接&#xff1a;https://github.com/XiangLi1999/Diffusion-LM 一、简介 无需重训模型控制语言模型的表现是自然语言生成&#xff08;NLG&#xff09;的一个重要开放问题&#xff0c;近期工作已经在简单句子属性控…