react简介

2023-11-09

1 React简介

1.1 react发展历史:

react是facebook开发的,(vue-尤雨溪。angular-谷歌-收购的)facebook在构建instagram网站的时候遇见两个问题:

  1. 数据绑定的时候,大量操作真实dom,性能成本太高,比较浪费
  2. 网站的数据流向太混乱,不好控制

于是facebook起初调研过市场上已存的mvc框架,比如angularjs,发现都不太满意,于是就推陈出新,开发了react框架,并在2013年五月份开源,国内2016年才开始首先在杭州使用。

1.2 react 特点:

  • 声明式设计 −React采用声明范式,可以轻松描述应用(自动dom操作)

  • 高效 −React通过对DOM的模拟(虚拟dom),最大限度地减少与DOM的交互

  • 灵活 −React可以与已知的库或框架很好地配合,比如(jquery库)

  • JSX − JSX 是 JavaScript 语法的扩展

  • 组件 − 通过 React 构建组件,使得代码更加容易得到复用,能够很好的应用在大项目的开发中

  • 单向响应的数据流 − React 实现了单向响应的数据流,从而减少了重复代码,这也是它为什么比传统数据绑定更简单

React Fiber 是 16.+ 版本

1.3 React的优点

  • React速度很快:它并不直接对DOM进行操作,引入了一个叫做虚拟DOM的概念,安插在javascript逻辑和实际的DOM之间,性能好。最大限度减少DOM交互。

  • 跨浏览器兼容:虚拟DOM帮助我们解决了跨浏览器问题,它为我们提供了标准化的API,甚至在IE8中都是没问题的。

  • 一切都是component:代码更加模块化,重用代码更容易,可维护性高。这样当某个或某些组件出现问题是,可以方便地进行隔离。每个组件都可以进行独立的开发和测试,并且它们可以引入其它组件。这等同于提高了代码的可维护性。

  • 单向数据流:Flux是一个用于在JavaScript应用中创建单向数据层的架构,它随着React视图库的开发而被Facebook概念化。减少了重复代码,这也是它为什么比传统数据绑定更简单。

  • 同构、纯粹的javascript:因为搜索引擎的爬虫程序依赖的是服务端响应而不是JavaScript的执行,预渲染你的应用有助于搜索引擎优化。

  • 兼容性好:比如使用RequireJS来加载和打包,而Browserify和Webpack适用于构建大型应用。它们使得那些艰难的任务不再让人望而生畏。

1.4 React 的缺陷

  • React 只是一个视图库,而不是一个完整的框架。

  • 对于 Web 开发初学者来说,有一个学习曲线。

  • 将 React 集成到传统的 MVC 框架中需要一些额外的配置。

  • 代码复杂性随着内联模板和 JSX 的增加而增加。

  • 如果有太多的小组件可能增加项目的庞大和复杂。

1.5 vue的优点

  • 性能高效

  • 双向数据绑定

  • 学习难度低,上手简单。

2 React环境搭建

2.1 引入.js文件(不方便)

2.2 通过脚手架工具来编程

官方:Creat-react-app

1.安装node.js(推荐使用LTS版本)

2.安装cnpm 淘宝镜像: https://npm.taobao.org/

​ 命令:npm install -g cnpm --registry=https://registry.npm.taobao.org

2.node命令行行执行以下命令

img

create-react-app my-app
cd my-app
npm start

   
   
   
   
  • 1
  • 2
  • 3

安装完成

img

img

3 React工程目录简介

工程目录如下:

img

node_modules文件夹

  • 里面存放的是我们所建项目放所依赖的第三方的包

public文件夹

  • favicon.ico

图标文件,网页标题左上角的小图标

img

  • index.html

项目首页的HTML模板

  • manifest.json

manifest.json 是配合PWA 使用的文件。

src 文件夹

  • index.js(all in js)

整个程序的入口文件,也就是整个项目从index.js 里面开始逐行执行

  • ServiceWorker

为用户在本地创建一个service worker 来缓存资源到本地,提升应用的访问速度

  • App.test.js

自动化的测试文件

yarn.lock

  • 项目文件依赖安装包的版本号

README.md

  • 项目的说明文件 --可以改为自己目录的说明

package.json

  • 每个脚手架工具里面都有一个package.json文件,表示脚手架工具其实是一个node包工具,有一些项目介绍,依赖的包等

gitgnore

  • 如果用git管理代码的话,有些文件不想传到git仓库的话,可以把这些文件定义到这里。

4 React中的组件

标题->标题组件搜索->搜索组件->input组件和button组件img前端组件化优势:维护方便另一种方式:调用render方法,可以将react元素渲染到真实的dom中。index.js

4.1APP组件

App.js

import React from 'react';

//函数无状态组件
function App() {
return (
<div>
Helllo world
</div>
);
}

export default App;
import React ,{ Component }from ‘react’;
/*
import { Component } from ‘react’;
//等价于
import React from ‘react’
const Component = React.Component
*/

//ES6类方法 组件
class App extends Component {
render() {
return (
<div>
Helllo world
</div>
);
}
}

export default App;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

4.2 Render方法

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App'; //自动补全js后缀
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
<React.StrictMode>
<App /> //JSX 语法
</React.StrictMode>,
document.getElementById(‘root’)
);
//将我们APP中的节点,挂载到id=root的节点下面

serviceWorker.unregister();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

img

注:使用JSX语法 需要引入 import React from 'react';

5 JSX语法

React 使用 JSX 来替代常规的 JavaScript。JSX 是一个看起来很像 XML 的 JavaScript 语法扩展。我们不需要一定使用 JSX,但它有以下优点:

  • JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化。

  • 它是类型安全的,在编译过程中就能发现错误。

  • 使用 JSX 编写模板更加简单快速。

在上节认识了组件,原来我们在html中写标签,但是在React中,我们直接将标签写在了.js文件中,就是说在React中,书写html标签这种方法,称之为JSX语法。此外,我们除了可以使用html定义的标签,我们也可以使用自己定义的标签,如下面定义的APP标签。

【注】JSX中组件开头,必须以大写字母开头。

因此我们可以区分:

  • 大写字母开头为自定义的组件
  • 小写字母为html标签

例子:

App.js

import React ,{ Component }from 'react';

//ES6类方法 组件
class App extends React.Component {
render() {
return (
<div>
Helllo world
</div>
);
}
}

export default App;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App'; //自动补全js后缀
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById(‘root’)
);

serviceWorker.unregister();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

注:下面大部分的代码从todolist摘取(第三章)

5.1表达式

我们可以在 JSX 中使用 JavaScript 表达式。表达式写在花括号 {} 中。实例如下:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App'; //自动补全js后缀
import * as serviceWorker from './serviceWorker';

ReactDOM.render(
<div>
<h1>{ 1+1 }</h1>
</div>,
document.getElementById(‘root’)
);

serviceWorker.unregister();

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

img

5.2 格式

render 返回的元素,必须包含在一个大的元素之中

//错误写法
render () {
	return (
	<div>第一个</div>
	<div>第二个</div>
	)
}

//正确写法
render () {
return (
<div>
<div>第一个</div>
<div>第二个</div>
</div>
)
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

可以引入Fragment占位符代替

import React, { Component, Fragment } from 'react';  //主要要引入该元素

class TodoList extends Component {
render() {
return (
<Fragment>
<div><input/><button>提交</button></div>
<ul>
<li>学英语</li>
<li>learn English</li>
</ul>
</Fragment>
)
}
}

export default TodoList;

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

5.3 JSX中的注释

使用{/注释/} 在vscode中 使用快捷键 CTRL + / 来进行快速注释

alt + shitf + A 群体注释

render() {
      return (
      <Fragment>
        <div>
          {/* 这是一个注释 */}
          <input 
            value={this.state.inputValue}
            onChange={this.handleInputChange.bind(this)}  //在这里加this
          /> 
          <button onClick={this.handleBtnClick.bind(this)}>提交</button>
        </div>
        <ul>
          {
            this.state.list.map((item, index) => {
              return <li 
                      key={ index } 
                      onClick={this.hanleItemDelete.bind(this, index)}
                      >
                      { item }
                      </li>  // 用index做key值不好
            })
          }
        </ul>
      </Fragment>
    )
  }

 
 
 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

5.4 引入样式

我们创建一个style.css

.input {
    border: 1px solid red; //我们在给input框增加一个样式
}

 
 
 
 
  • 1
  • 2
  • 3

注意引用的时候:为了防止class当成类,在JSX中,class的属性,使用 className。

如下className=‘input’

render() {
      return (
      <Fragment>
        <div>
          {/* 这是一个注释 */}
          <input
            className='input'   //使用class
            value={this.state.inputValue}
            onChange={this.handleInputChange.bind(this)}  //在这里加this
          /> 
          <button onClick={this.handleBtnClick.bind(this)}>提交</button>
        </div>
        <ul>
          {
            this.state.list.map((item, index) => {
              return <li 
                      key={ index } 
                      onClick={this.hanleItemDelete.bind(this, index)}
                      >
                      { item }
                      </li>  // 用index做key值不好
            })
          }
        </ul>
      </Fragment>
    )

 
 
 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

5.5 input中输出的样式不进行转义

如果我们不进行设置,它会自动转义

img

当我们想要设置显示为样式的时候,我们要在li标签中增加一条属性

dangerouslySetInnerHTML = {{__html: item}}

这样就不会进行转义了

img

<ul>
      {
      this.state.list.map((item, index) => {
        return <li 
        key={ index } 
        onClick={this.hanleItemDelete.bind(this, index)}
    		dangerouslySetInnerHTML = {{__html: item}}
      >
        </li>  // 用index做key值不好
    })
   }
</ul>

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

5.6 label标签

在lable标签中,使用for进行一个扩大选择范围。

在React中,为了防止与for循环的关键字 for重合,使用 htmlFor=“insertArea”

<label htmlFor="insertArea">输入内容:</label>
<input
    id="insertArea"
    className='input'   //使用class
    value={this.state.inputValue}
    onChange={this.handleInputChange.bind(this)}  //在这里加this
/> 

 
 
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react简介 的相关文章

随机推荐

  • IO性能相关

    1 IO性能解决方案整理 网卡性能优化方案 绑定中断 至特定CPU 减少接口属性设置 数据包打入CPU标签 提升缓存命中 磁盘随机读写优化方案 批量读写 寻道更快 转速更高的硬盘 内存作为缓存 SSD RAID 磁盘顺序读写优化方案 RAI
  • javascript 简单高效判断数据类型 系列函数 By shawl.qiu

    javascript 简单高效判断数据类型 系列函数 By shawl qiu 说明 前段时间把 ASP VBScript 掌握得差不多的时候 就转而学习 Javascript Jscript 主要是学 Jscript 啦 不过这两者基本上
  • spring事件广播机制

    打个比方 当我们和其他公司进行业务接口对接时 我们这边需要保存或者修改某些数据 但是保存和修改这些数据对整个流程没有太大的影响 这个时候我们应该怎么做呢 是的 我们要考虑异步去保存或者修改数据 但怎么去异步保存数据呢 这个时候我们就可以使用
  • 3.5 编写一个程序,从标准输入读入某职员的工作时间(以小时计)和每小时的工资 数,计算并输出他的工资。若职员月工作时间超过 40 小时,则超过部分按原工资的 1.5 倍 来计算。

    3 5 编写一个程序 从标准输入读入某职员的工作时间 以小时计 和每小时的工资 数 计算并输出他的工资 若职员月工作时间超过 40 小时 则超过部分按原工资的 1 5 倍 来计算 include
  • git push --force

    一 force命令 如果git要强制覆盖 那么可以使用 force命令 git push force origin 二 参考资料 1 阮一峰 Git远程操作详解
  • Java操作excel之POI和easyExcel 教程详解 狂神笔记

    文章目录 1 应用场景 2 Apache POI 简介 项目准备 代码演示 大文件写HSSF 03 大文件写XSSF 07 大文件写SXSSF 07升级版 POI Excel读 3 easyExcel 简介 项目准备 EasyExcel写入
  • 宝塔php7.0shell,BT_Panel 宝塔开心面板/V7.0.1开心版

    脚本简介 本次面板版本 7 0 1 本脚本支持一键安装开心版宝塔面板 以及 已经安装宝塔面板升级开心版 感谢大家使用 书记的脚本 本脚本未加密 有没有后门大家自己看就知道了 如果你使用了类似 书记的脚 出现问题 以及 脚本地址非本人的 或者
  • 金碟生产相关表

    生产订单表 SELECT FInterID from AIS20151222141907 dbo ICMO where left convert varchar FPlanCommitDate 120 10 gt 2020 08 01 an
  • Bridge桥接模式

    作用 将抽象部份与它的实现部份分离 使它们都可以独立地变化 将抽象 Abstraction 与实现 Implementation 分离 使得二者可以独立地变化 桥接模式号称设计模式中最难理解的模式之一 关键就是这个抽象和实现的分离非常让人奇
  • JVM基础知识

    目录 1 前言 2 JVM运行流程 3 JVM运行时数据区 4 JVM类加载 5 有关垃圾回收 1 前言 本文只是针对面试中比较常见的有关JVM的问题做出补充 俗称八股文 同时帮助大家对JVM建立一个感性的认识 所以并不会对JVM有过多的深
  • [原]Qt Designer中自定义控件的使用(提升法与插件法)

    准备乱写一点Qt自定义Widget在Designer中的使用 可是又不想重复提升法 promotion 及插件法基本用法 因为Manual中Using Custom Widgets with Qt Designer已经说的很清楚了 使用de
  • 解决:Jetson系列python3 import 报错 “Illegal instruction core dumped “

    解决 Jetson系列python3 import 报错 Illegal instruction cpre dumped 解决方法 解决方法 编辑环境变量 sudo gedit bashrc 在最后一行添加 export OPENBLAS
  • mongod: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file:

    mongod error while loading shared libraries libcrypto so 1 0 0 cannot open shared object file No such file or directory
  • 14个提高代码质量的好问题

    阅读本文大概需要 2 6 分钟 并不是代码写的越多 代码的质量就越高 思考才是 解决一个问题 打开电脑就手撕代码 最终的结果往往是各种代码问题 经过一系列迭代后 代码积重难返 最终的结果就是推到重来 前期的付出都白费 最典型的就是现在所谓的
  • 图像中不规则物体的长轴与短轴:OpenCV实现指南

    1 首先 读取图像并将其转换为灰度图像 2 进行图像预处理 包括使用高斯模糊和阈值化 以便更好地处理图像 3 通过使用OpenCV的cv2 findContours 函数 找到图像中的所有轮廓 4 遍历所有轮廓 如果轮廓点的数量大于等于5个
  • Ai绘画到底是创造艺术还是窃取艺术呢

    随着智能AI技术的发展 AI绘画已经成为一个非常热门的领域 AI绘画的应用范围非常广泛 它对于设计 摄影等领域产生了积极影响 但同时 由于AI绘画的版权究竟归属于谁 AI绘画也引起了版权的争议 那么 AI到底是创造艺术还是窃取艺术呢 本文将
  • 02线程池的结构体描述信息

    02线程池的结构体描述信息 01线程池原理剖析 02线程池的结构体描述信息 03线程池的各个函数解析 04线程池完整的头文件和实现文件 c 直接看代码 代码里有详细的注释 描述任务队列的结构体 typedef struct void fun
  • html+css实现一个响应式管理平台架构模板

    文本将会带你使用html css实现一个响应式的管理平台架构模板 目前来说市面上的管理平台架构模板大同小异 文本的知识点都会符合场景所需 目录 1 管理平台的架构内容 2 顶部的布局 3 下半部分布局 4 左侧菜单区域实现 5 右侧主体区域
  • 【EasyExcel 教程】详解写入Excel -- 写入

    愿你如阳光 明媚不忧伤 目録 4 详解写入Excel 4 1 简单写入Excel 4 2 根据参数导出指定列 排除或指定 4 3 指定写入的列 4 4 复杂头写入 4 5 日期 数字或者自定义格式的转换 4 6 图片导出 列宽 行高注解 4
  • react简介

    1 React简介 1 1 react发展历史 react是facebook开发的 vue 尤雨溪 angular 谷歌 收购的 facebook在构建instagram网站的时候遇见两个问题 数据绑定的时候 大量操作真实dom 性能成本太