# react学习素材
**Repository Path**: deng_da_chao/react-learning-materials
## Basic Information
- **Project Name**: react学习素材
- **Description**: 供应react学习使用
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2022-03-15
- **Last Updated**: 2022-03-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: React, 学习资料
## README
# react版本环境:
"react-router-dom": "^5.2.2",
## 路由的基本使用
* 明确好界面中的导航区、展示区
* 导航去的a标签为Link标签
``` Dome ```
* 展示区写Route标签进行路径的匹配
``` ```
* 的最外侧包裹了一个或者
## 路由组件与一般组件
* 写法不同:
* 一般组件:
* 路由组件:
* 存放位置不同:
* 一般组件:components
* 路由组件:pages
* 接收到的props不同:
* 一般组件:写组件标签时传递了什么,就能收到什么。
* 路由组件:接收到三个固定的属性
```
history: - 路由方法
go: ƒ go(n)
goBack: ƒ goBack()
goForward: ƒ goForward()
push: ƒ push(path, state)
replace: ƒ replace(path, state)
location: - 路由传参获取
pathname: "/home"
search: ""
state: undefined
match: - 路由信息
params: {}
path: "/home"
url: "/home"
```
## NavLink与封装NavLink
* NavLink可以实现路由链接的高亮,通过activeClassName指定样式名;
* 标签体内容是一个特殊的标签属性;
* 通过this.props.childrea可以获取标签体内容
## Switch快速一对一匹配路由
* 通常情况下,path和component是一一对应的关系.
* Switch可以提高路由匹配效率(单一匹配).
## 解决多级路径刷新页面样式丢失问题
* public/index.html 中引入样式时不写 ./ 写 / (常用)
* public/index.html 中引用样式时不写 ./ 写 %PUBLIC_URL% (常用)
* 路由使用HashRouter模式
## 路由的严格匹配与模糊匹配
* 默认使用的是模糊匹配(简单:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
* 开启严格匹配:
* 严格匹配不要随便开启,需要再开,有些时候开启会导致无法继续匹配二级路由
## Redirect重定向路由
* 一般写在所有路由注册的最下方,当所有路由都无法匹配时,跳转到Redirect指定的路由;
* 编码如下:
```
```
## 嵌套路由
* 注册子路由时要写上父路由的path值
* 路由的匹配是按照注册路由的顺序进行的
## 向路由组件传递参数
* params参数
* 路由链接(携带参数):详情
* 注册路由(声明接收):
* 接收参数:const {id,title} = this.props.match.params
* search参数
* 路由链接(携带参数):详情
* 注册路由(无需声明,正常注册即可):
* 接收参数: const {search} = this.props.location
* 备注:获取到的search是urlencoded编码字符串,需要借助querystring解析;
* state参数
* 路由链接(携带参数):详情
* 注册路由(无需声明,正常注册即可):
* 接收参数: this.props.location.state
* 备注:刷新也可以保留住参数;
## 编程式路由导航
* 借助this.props.history对象上的API对操作路由跳转、前进、后退
* this.props.history.push()
* this.props.history.replace()
* this.props.history.goBack()
* this.props.history.goForward()
* this.props.history.go(-2)
## BrowserRouter与HashRouter的区别
* 底层原理不一样:
* BrowserRouter使用的是H5的history API,不兼容IE9及以下版本.
* HashRouter使用的是URL的哈希值.
* path表现形式不一样:
* BrowserRouter的路径中没有#.
* HashRouter的路径中包含#.
* 刷新后对路由state参数的影响:
* BrowserRouter没有任何影响,因为state保存在history对象中.
* hashRouter刷新后会导致路由state参数的丢失.
* 备注:HashRouter可以用于解决一些路径错误相关的问题.
# redux状态管理 -------------------------------------
## redux精简版
* 文件创建布局
- src
- redux
- store.js
- reducer.js
* store.js:
* 引入redux中的createStore函数,创建一个store
* createStore调用时要传入一个为其服务的reducer
* 记得暴露store对象
* reducer.js:
* reducer的本质是一个函数,接收:perState\action 返回加工后的状态
* reducer有两个作用: 初始化状态\加工状态
* reducer被第一次调用时,是store自动触发的,传递的preState是undefined
* 在index.js中检测store中状态的改变,一旦发生改变重新渲染
* 备注: redux只负责管理状态,至于状态的改变驱动着页面的展示,要靠我们自己写
## redux完整版
* action.js 专门用于创建action对象
* constant.js 放置容易写错的type值常量
## redux异步action版
* 明确:延迟的动作不想交给组件自身,想要交给action
* 何时需要异步action:想要对状态进行操作,但是具体的数据靠异步任务返回.
* 使用流程:
* npm add redux-tthunk,并配置到store中
* 创建action的函数不再返回一般对象,而是一个函数,该函数中写异步任务.
* 异步任务有结果后,分发一个同步的action去真正操作数据.
* 备注:异步action不是必须要写的,完全可以自己等待异步任务的结果了再去分发同步action.