# reactStudy
**Repository Path**: webheng/reactStudy
## Basic Information
- **Project Name**: reactStudy
- **Description**: 关于react学习的代码
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-01-16
- **Last Updated**: 2022-01-16
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 第一课 react简介
- react是一种新的编程思想 all in js
- facebook 2013年五月退出
- 函数式编程
- 使用人数最多的前端框架
- 健全的文档与完善的社区
- react fiber 指的是react16版本
- react的主要特点
- 声明式开发
- 可以与其他框架并存
- 组件化
- 单向数据流
- 视图层框架
- 函数式编程
#### 相比于vue
- 灵活性比较高的项目
## 第二课 开发环境的搭建
- 第一种方式js文件使用react
- 第二种方式使用脚手架工具来编码(初学建议使用react官方提供的脚手架工具create-react-app),具体安装步骤参见官网
#### 搭建步骤
- 安装node
- npm install create-react-app -g
- create-react-app 项目名称
- cd 进入相应的文件夹
- 运行yarn start或者npm run dev
#### 了解工程目录的内容
- readme项目的说明文件,可以自己编写
- package.json脚手架的相关依赖
- node_modules第三方模块依赖包
- public favicon.ico浏览器左上角的icon
- public index.html首页的相关模板内容
- src目录是项目开发的最重要的目录,所有的入口在index.js里面
#### JSX语法
```javascript
ReactDOM.render(
, document.getElementById('root'));
render(){//jsx语法
return (
hello world第一个组件创建
)
}
//简单理解就是可以直接在js文件中编写html代码,但是在JSX中不仅可以使用html,同样也可以实现js功能,jsx识别组件必须是以大写开头
```
## 第三课 使用react实现一个toDoList功能(toDoList.js)
- immutable 不要直接改变state的内容
- jsx的语法细节
- 注释:单行注释{/*注释内容*/},多行注释{//注释内容}
- 在jsx标签中不能使用class会与关键字冲突,需要使用className
- text和HTML的转义
```JavaScript
dangerouslySetInnerHtml = {{__html:item}}
```
- 在下面的情况下react会报错,因为for与关键字冲突,需要使用htmlFor代替
```JavaScript
```
## 第四课 propTypes defaultProps
- 使用propsTypes,首先是引入,
```JavaScript
import PropTypes from 'prop-types';
```
- 对props类型做定义
```JavaScript
TodoItem.propTypes={
content:PropTypes.string.isRequired,
itemDelete:PropTypes.func,
index:PropTypes.number
}//代表是必传的项:isRequired
```
```JavaScript
TodoItem.defaultProps = {
test:"hello world"
};
```
- [官网相关示例](https://reactjs.org/docs/typechecking-with-proptypes.html)
## 第五课 props state 与render函数的关系
- 当组件的props或者state发生改变的时候,render函数就会重新执行
- 当父组件的render函数执行的时候,前提是这个渲染和子组件有关系,子组建的render函数也会执行一次
- state数据渲染过程
- 首先在constructor里面初始化了state数据
- 有一段JSX模板
- 数据+模板结合,生成真实的dom并且渲染显示
- state数据发生改变
- 数据+模板结合,生成真实的dom,替换原始的都没并且渲染
+ 在以上的过程中存在一个漏洞缺陷,第一次生成一个完整的dom,第二次同样生成一个完成的dom
- 对于漏洞的弥补,可以将新的dom和原始的dom做对比,找差异,
- 例如找出input框发生变化
- 只用局部的新元素替换掉局部的老元素
- 但是以上解决方案对性能的提升依然并不是非常明显
- react应对这个问题提出了虚拟dom的方案
- 完整的顺序
- 首先在constructor里面初始化了state数据
- 有一段JSX模板
- 数据+模板结合,生成真实的dom并且渲染显示
- 生成虚拟dom(虚拟dom就是一个js对象,用它来描述真实dom) ['元素',{元素自身所带的属性},['嵌套元素',{元素相应的属性}]](在这步过程中损耗了性能)
- state数据发生改变
- 比较原始虚拟dom中的内容和新虚拟dom的区别,找到相应的元素,直接操作相应的元素改变其中的内容(在这一步过程中极大地提高了性能)这里要采用rea的diff算法,所谓diff算法,就是寻找差异的算法different,其中最重要的就是同级比较
- react中ref的使用
```HTML
{this.input=input}}
onChange={this.handleInputChange}
/>
```
## 第六课 组件的生命周期(在某一时刻组件会自动调用的函数)
- 组件初始化的时候
- Initinalization 这时候组件会初始化自己的数据(set props and state),发生在函数constructor
- mounting(componentWillMount,render,componentDidMount),只是在页面挂载的时候(组件第一次挂载到页面的时候)执行,其余时间改变dom的时候,只有render执行
- componentWillMount在页面挂载之前执行,当组件即将被挂载到页面的时候执行
- componentDidMount在组件被挂载的页面之后执行,在这个函数中通常是写ajax数据请求的过程,
- render函数必须自己编写,且不可或缺,render函数不能操作数据,因为操作完数据,又会重新进入到render函数中,这时候就会造成一个死循环。
- 组件更新过程中涉及的函数
- updation 在组件更新的过程中涉及的生命函数,shouldComponentUpdate在组件即将跟新前调用,这个函数要求返回一个布尔值,布尔值真代表需要被更新,布尔值假代表不需要被更新
- 当props发生变化的时候(componentWillRecevieProp一个组件存在props的时候会调用,执行的之后会执行shouldComponentUpdate,false不会继续执行,true继续执行,componentWillUpdate,之后会执行render函数,最后执行componentDidUpdate)
- componentWillRecevieProp 当一个组件要从父组件接收参数,只要父组件的render函数被执行了,子组件的这个生命周期就会被执行,如果这个组件第一次存在于父组件中,不会被执行,如果这个组件已经存在于这个父组件中才会被执行
- 当states发生变化的时候调用的生命周期,shouldComponentUpdate,与上文同理,componentWillUpdate,render,componentDidUpdate
- Unmounting组件卸载的时候涉及到的生命周期
- componentWillUnMount 当这个组件即将被页面剔除的时候执行
- 所有的生命周期函数都可以删除,唯独render函数
- shouldComponetnUpdate主要是为了提高性能而设置的,并不是所有的数据改变都需要执行render函数,该生命钩子会接收两个参数,nextProps和nextState,可以根据相应的条件判断返回布尔值来确定渲染
- 在页面初始化的时候,需要动态加载一些数据,也就是ajax请求,这个请求适合放在componentDidMount函数里,放在render函数中会出现一个死循环,之所以使用这个生命钩子是因为这个函数只会被执行一起,那么为什么不放在componentWillMount但是在react-native中或者在其他开发环境下该生命周期会有问题
### 第五课 在react中发送ajax请求
- 使用axios,具体使用规则参见[此处](https://www.kancloud.cn/yunye/axios/234845)
- 使用Charies模拟接口请求(一个在本地模拟接口请求的工具,同时可以抓取本地浏览器的请求)(未完待续)
### 第六课 react中的动画
- 借助css3进行布尔值切换className并通过transition实现
- 使用css动画效果,只要是通过keyframes
- 使用react-transition-group,详情见[官方文档](https://reactcommunity.org/react-transition-group/)
```JavaScript
import { CSSTransition } from 'react-transition-group';
{
this.setState({
showValidationButton: true,
});
}}
>
```
### 第七课 redux
- redux = reducer+flux
- redux的工作流程
- 向图书馆借书-->借什么书-->图书馆管理员接收到操作-->查询后将书籍给使用者
- 
- component-->action creators-->reducers-->store-->component
- 使用[ant](https://ant.design/index-cn) redux重新编写todolist
- 关于redux的总结
- store是唯一得
- 只有store能够改变自己的内容
- reducer必须是个纯函数,纯函数,给到固定的输入,一定有固定的输出,而且不会有任何副作用
- redux 核心api
- createStore
- store.subscribe
- store.dispatch
- store.getState
- createStore
### 第八课 UI组件与容器组件的拆分
- UI组件:傻瓜组件
- 容器组件:聪明组件
- UI组件负责页面的渲染,容器组件负责页面的逻辑
- 无状态组件:既一个函数,当一个普通组件只有一个render函数的时候,我们可以通过一个无状态组件替换掉普通的组件
- redux中发送数据请求获取数据
- 使用[redux-thunk](https://github.com/reduxjs/redux-thunk),原始的redux中,action只能是一个对象,通过redux-thunk中间件,可以接收action为一个函数
- react-redux的使用
### 第九课 一些优化注意点
- [PureComponent](https://segmentfault.com/a/1190000014979065?utm_source=tag-newest)
- import {Link} from "[react-router-dom](https://www.jianshu.com/p/a94c9a615f75)";减少对应路由 页的加载次数,如果是a标签跳转,会重新请求一次页面,同时页面会发白一次
- [style-components](https://www.jianshu.com/p/27788be90605)的相关知识点