# learn_react
**Repository Path**: mountyas793/learn_react
## Basic Information
- **Project Name**: learn_react
- **Description**: learn_react学习react基础仓库
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2023-11-01
- **Last Updated**: 2024-12-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: React
## README
# Learn to react
## 第一章:React 入门
### 安装与介绍
#### 介绍
学习react知识记录
#### 说明
##### react特点
1.采用**组件化模式**,**声明式编码**,提高开发效率和代码复用率
2.在React Native中可以使用React语法进行**移动端开发**
3.使用**虚拟DOM**+优秀的**Diffing 算法**,尽量减少与真实DOM的交互(不会重复加载已存在的DOM数据)
##### react前置技能库

##### react依赖包
react依赖包有三个:
1.react.min.js //react的核心包
2.react-dom.min.js //react 操作dom的包
3.babel.min.js //转译包
##### 安装react 两种方法:
1.直接使用cdn
路径如下:(生产环境中不要用)
```html
```
2.使用npm 安装 create-react-app命令
1.先安装npm 或者 cnpm
2.npm install -g create-react-app
3.create-react-app my-app
4.cd my-app/
5.npm start
然后在浏览器中打开http://localhost:3000 出现react的六芒星就好了
## 第二章:React 面向组件编程
### 一、React三大属性之State总结
#### 1.1理解
1.state 是组件对象最重要的属性,值是对象(可以包含多个 key-value 的组合)
2.组件被称为“状态机”通过更新组件的 state 来更新对应的页面显示(重新染组件)
#### 1.2特别注意
1.组件中 render 方法中的 this 为组件实例对象
2.组件自定义的方法中 this 为 undefined,如何解决?
a. 强制绑定 this:通过函数对象的 bind()
b. 箭头函数
3.状态数据,不能直接修改或更新
### 二、React三大属性之Props总结
#### 2.1理解
1.每个组件对象都会有 props 属性
2.组件标签的所有属性都保存在 props 中
#### 2.2作用
1.通过标签属性从组件外向组件内传递变化的数据
2.注意:组件内部不要修改props数据
#### 2.3编码操作
1.内部读取某一个值
```js
this.props.name
```
2.对props中的属性进行类型限制和必要性限制
```js
// Person类组件中简写
static Person.propType{
name: PropType.string.isrequired, // 调用PropType库,限制name属性数据类型为string,并且必填
}
```
3.扩展属性:将对象的所有属性通过props传递
```js
// Person类组件,批量传递参数
const p = [1, 2, 3, 4, 5, 6]
//将p中的数据批量传递给Person类,并通过Babel解析读取列表
```
4.默认属性
```js
// 方式一(放在Person类或者函数外边, 类和函数通用)
Person.defultProps = {
age:18, // 默认年龄18
sex:"男"
}
// 方式二(类方法简写,放在类里边)
static defultProps = {
age:18, // 默认年龄18
sex:"男"
}
```
### 三、React 生命周期(生命周期钩子)
#### 3.1生命周期三个阶段(旧)

1.**始化阶段**: 由 ReactDOMrender() 触发---初次染
* constructor()
* componentWillMount()
* render()
* componentDidMount()
2.**更新阶段**: 由组件内部 this.setSate() 或父组件重新 render 触发
* shouldComponentUpdate()
* componentWillUpdate()
* render()
* componentDidUpdate()
3.卸载组件:由 ReactDOM.unmountComponentAtNode() 触发
* componentWillUnmount()
**常用钩子**:
rander (初始化渲染钩子) :必不可少
componentDidMount (挂载完成钩子) :一般在这个钩子中做一些初始化的事,例如: 开启定时器、发送网络请求、订阅消息
componentWillUnmount (将要卸载钩子) : 一般在这个钩子中做一些收尾的工作,例如: 关闭定时器、取消订阅
#### 3.2生命周期三个阶段(新)

1.**初始化阶段**:由ReactDOM.render()触发 --- 初次渲染
1. constructor()
2. **getDerivedStateFromProps()**
3. render()
4. componentDidMount()
2.**更新阶段**: 由组件内部this.setSate()或父组件重新 render 触发
1. **getDerivedStateFromProps()**
2. shouldComponentUpdate()
3. render()
4. **getSnapshotBeforeUpdate()**
5. componentDidUpdate()
3.**卸载组件**:由 ReactDOMunmountComponentAtNode()触发
1.componentWillUnmount()
**重要钩子**
1.rander:初始化渲染或更i性能渲染调用
2.componentDidMount: 开启监听, 发送 ajax 请求
3.componentWillUnmount: 做一些收尾工作, 如:清理定时器
## 第三章:React 应用(基于 React 脚手架)
### 3.1使用create-react-app 创建react应用
#### 3.1.1react 脚手架
1.xxx脚手架:用来帮助程序员快速创建一个基于xxx库的模板项目
1. 包含了所有需要的配置 (语法检查、jsx 编译、devServer...)
2. 下载好了所有相关的依赖
3. 可以直接运行一个简单效果
2.react 提供一个用于创建 react 项目的脚手架库:create-react-app
3.项目的整体技术架构为:react + webpack + es6 + eslint
4.使用脚手架开发的项目特点:模块化、组件化、工程化(自动完成一系列开发流程:代码检查、图片检查。。。)
#### 3.1.2创建项目并启动
全局安装:
```shell
npm install -g create-react-app
npm i -g create-react-app
```
切换到想要创建项目的目录:
```shell
create-react-app [projctName]
```
进入项目文件夹:
```shell
cd [projctName]
```
四、启动项目:
```shell
npm start
```
#### 3.1.3react 脚手架项目结构
public——静态资源文件夹
favicon.icon ------网站页签图标
**index.html -------- 主页面**
logo192.png------- logo图
logo512.png------- logo图
manifest,json -----应用加壳的配置文件
robots.txt--------爬虫协议文件
src——源码文件夹
App.css--------App 组件的样式
**App.js --------App 组件**
App.testjs ---- 用于给App 做测试
index.css ------样式
**index.js -------入口文件**
logo.svg-------- logo 图
reportWebVitals.js---页面性能分析文件(需要web-vitals 库的支持)
setupTests.js---组件单元测试的文件(需要jest-dom 库的支持)
### 3.2功能化界面的组件化编码流程(通用)
1.拆分组件:拆分界面,抽取组件
2.实现静态组件:使用组件实现静态页面效果
3.实现动态组件
3.1动态显示初始化数据
3.1.1数据类型
3.1.2数据名称
3.1.3保存在哪个组件
3.2交互(从绑定事件监听开始)
## 第四章:React axios
### 4.4消息订阅-发布机制
1.工具库:PuSubJs
2.下载:
```shell
npm install pubsub-js --save
yarn add pubsub-js
```
3.使用
```js
// 引入
import PubSub from 'pubsub-js'
// 订阅
PubSub.subscribe('delete', function(msg, data)=>{
})
// 发布消息
PubSub.publish('delete', data)
```
## 第五章:React 路由
### 5.1 相关理解
#### 5.1.1 SPA的理解
1. 单页Web应用(single page web application,SPA)
2. 整个应用只有一个完整的页面
3. 点击页面中的链接不会刷新页面,只会做页面的局部更新。
4. 数据都需要通过 Ajax 请求获取, 并在全段异步展示。
### 5.2 react-route相关API
1. #### 什么是路由
1. 一个路由就是一个映射关系(key:value)
2. key 为路径, value 可能是 function 或者 component
### 5.3 基本路由使用
1. #### 导入路由组件
```shell
// 下载 react-router-dom 5版本
yarn add react-router-dom@5
```
### 5.4 嵌套路由使用
### 5.5 向路由组件船体参数数据
### 5.6 多种路由跳转方式
## 第六章: redux
### 6.1 redux理解
#### 6.1.1 学习文档
中文文档:https://cn.redux.js.org/
#### 6.1.2 redux是什么
1. redux是一个专门用于做**状态管理**的 JS 库(不是 react 插件库)。
2. 它可以用在 react, angular, vue 等项目中, 但基本与 react 配合使用。
3. 作用:集中式管理 react 应用中多个组件**共享**的状态。
#### 6.1.3 什么情况使用 redux
1. 某个组件的状态,需要让其他组件可以随时拿到(共享)。
2. 一个组件需要改变另一个组件的状态(通信)。
3. 总体原则: 能不用就不用如果不用比较吃力才考虑使用。
#### 6.1.4 redux 工作流程图& redux的三个核心概念

1. Action :