# react-comprehensive
**Repository Path**: tongyaozhang/react-comprehensive
## Basic Information
- **Project Name**: react-comprehensive
- **Description**: React综合复习
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2021-05-04
- **Last Updated**: 2021-06-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
### 1、项目搭建
#### 1.1 路由基本使用
1.明确好界面中的导航区、展示区
2.导航区的a标签改为Link标签
```html
Demo
```
3.展示区写Route标签进行路径的匹配
```html
```
4.``的最外侧包裹了一个``或``
#### 1.2 NavLink与封装NavLink
1.NavLink可以实现路由链接的高亮,通过activeClassName指定样式名
2.标签体内容是一个特殊的标签属性
3.通过`this.props.children`可以获取标签体内容
#### 1.3 Switch的使用
1.通常情况下,path和component是一一对应的关系
2.Switch可以提高路由匹配效率(单一匹配,一旦匹配上就不继续往下匹配了)
#### 1.4 路由的严格匹配与模糊匹配
1.默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
2.开启严格匹配:``
3.严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
### 2、React 基本使用
#### 2.1 JSX 基本使用
+ 变量、表达式
+ class style
+ 子元素和组件
#### 2.2 条件判断
+ if else
+ 三元表达式
+ 逻辑运算符 && ||
#### 2.3 列表渲染
+ map
+ key
#### 2.4 事件
+ bind this
+ 关于 event 参数
+ 传递自定义参数
#### 2.5 表单
+ 受控组件(表单的值受state影响)
+ input textarea select 用 value
+ checkbox radio 用 checked
#### 2.6 组件使用
+ props传递数据
+ props传递函数
+ props类型检查
#### 2.7 setState
+ 不可变值
+ 可能是异步更新
+ 可能会被合并
#### 2.8 生命周期
+ 单组件生命周期
+ 父子组件生命周期,和 Vue 的一样

### 3、React 高级特性
#### 3.1 函数组件
+ 纯函数,输入 props,输出 JSX
+ 没有实例,没有生命周期,没有 state
+ 没有扩展其他方法
#### 3.2 非受控组件
+ ref
+ defaultValue defaultChecked
+ 手动操作 DOM 元素
**使用场景**
+ 必须手动操作 DOM 元素,setState 实现不了
+ 文件上传 ``
+ 某些富文本编辑器,需要传入 DOM 元素
**受控组件 vs 非受控组件**
+ 优先使用受控组件,符合 React 设计原则
+ 必须操作 DOM 时,再使用非受控组件
#### 3.3 Portals
+ 组件默认会按照既定层次嵌套渲染
+ 如何让组件渲染到父组件以外?
**使用场景**
+ 父组件 overflow: hidden(父组件设置了 BFC )
+ 父组件 z-index 值太小
+ fixed 需要放在 body 第一层级
#### 3.4 context
+ 公共信息(语言、主题)如何传递给每个组件?
+ 用 props 太繁琐
+ 用 redux 小题大做
#### 3.5 异步组件
+ import()
+ React.lazy
+ React.Suspense
#### 3.6 性能优化
+ 性能优化,永远都是面试的重点
+ 性能优化对于 React 更加重要
+ 回顾讲 setState 时重点强调的不可变值
+ shouldComponentUpdate( 简称 SCU )
+ PureComponent 和 React.memo
+ 不可变值 immutable.js
**SCU 使用总结**
+ SCU 默认返回 true,即 React 默认重新渲染所有子组件
+ 必须配合 “不可变值” 一起使用
+ 可先不用 SCU,有性能问题时再考虑使用
**PureComponent 和 memo**
+ PureComponent,SCU 中实现了浅比较
+ memo,函数组件中的 PureComponent
+ 浅比较已适用大部分情况(尽量不要深度比较)
```js
function MyComponent(props){
/* 使用 props 渲染 */
}
function areEqual(prevProps, nextProps){
/*
如果把 nextProps 传入 render 方法的返回结果与
将 prevProps 传入 render 方法的返回结果一致则返回 true,
否则返回 false
*/
}
export default React.memo(MyComponent, areEqual);
```
**immutable.js**
+ 彻底拥抱 “不可变值"
+ 基于共享数据(不是深拷贝),速度好
+ 有一定学习和迁移成本,按需使用
```js
const map1 = Immutable.Map({a:1, b:2, c:3})
const map2 = map1.set('b', 50)
map1.get('b') // 2
map2,get('b') // 50
```
**性能优化 - 小结**
+ 面试重点,且涉及 React 设计理念
+ SCU PureComponent memo immutable.js
+ 按需使用 & state 层级
#### 3.7 关于组件公共逻辑的抽离
+ mixin,已被 React 弃用
+ 高阶组件 HOC
+ Render Props
**HOC vs Render Props**
+ HOC:模式简单,但会增加组件层级
+ Render Props:代码简洁,学习成本较高
+ 按需使用
### 4、Redux
+ 和 Vuex 作用相同,但比 Vuex 学习成本高
+ 不可变值,纯函数
+ 面试常考
#### 4.1 Redux 使用
+ 基本概念
- store state
- action
- reducer
+ 单项数据流
- dispatch(action)
- reducer - > newState
- subscribe 触发通知
+ react-redux
- Provider
- connect
- mapStateToProps mapDispatchToProps
+ 异步 action
- redux-thunk
- redux-promise
- redux-saga
+ 中间件
#### 4.2 Redux 原理图

#### 4.3 react-redux 模型图

### 5、React-router
+ 面试考点并不多(前提是熟悉React)
+ 路由模式(hash,H5 history),同 vue-router
+ 路由配置(动态路由、懒加载),同 vue-router
**路由模式**
+ hash模式(默认),如 http://abc.com/#/user/10
+ H5 history模式,如 http://abc.com/user/20
+ 后者需要 server 端支持,因此无特殊需求可选择前者
toC 客户端一般 H5 history,toB 控制后台一般 hash