# staging_0415
**Repository Path**: tianyucoder/staging_0415
## Basic Information
- **Project Name**: staging_0415
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-07-17
- **Last Updated**: 2021-07-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 笔记
## 1.脚手架自带文件
```
public ---- 静态资源文件夹
favicon.icon ------ 网站页签图标 --------- 最好有
index.html -------- 主页面 -----------必须有!
logo192.png ------- logo图
logo512.png ------- logo图
manifest.json ----- 应用加壳的配置文件
robots.txt -------- 爬虫协议文件
src ---- 源码文件夹
App.css -------- App组件的样式
App.js --------- App组件 ---------------必须有!
App.test.js ---- 用于给App做测试
index.css ------ 样式
index.js ------- 入口文件 --------------必须有!
logo.svg ------- logo图
reportWebVitals.js --- 进行页面性能分析
setupTests.js ---- 用于测试的文件
```
## 2.一个简单的组件
1.所有组件有一个外壳组件 —— App
2.除了App组件,所有其他的组件要放在components文件夹中
3.components文件夹结构:一个组件就是一个文件夹,文件夹中包含:结构、样式等等
即:components:
例如:Weather文件夹
```index.jsx 或 Weather.jsx```
```index.css 或 Weather.css```
## 3.样式的模块化
1. 给css文件命名时:写成```xxxx.module.css```
2. 引入样式
```js
import weatherStyle from './index.module.css'
```
3. 使用样式
```html
```
## 4.状态提升
1. 如果状态是某个组件用,则直接放在自身的state中
2. 如果状态是某些组件用,则放在他们共同的父组件中
3. 状态在哪里,操作状态的方法就在哪里
## 5.TodoList案例
1. 拆分组件时,要拆到位,结构、样式都要拆。
2. 组件化编码流程:
1. 拆分组件: 拆分界面,抽取组件
2. 实现静态组件: 使用组件实现静态页面效果
3. 实现动态组件
(1). 动态显示初始化数据
数据类型
数据名称
保存在哪
(2). 交互(从绑定事件监听开始)
3. ```src/App.css```或```src/index.css```放程序员写的公共样式。
4. ```eslint-disable-next-line```可以关闭eslint对下一行代码的语法检查。
5. ```/* eslint-disable */```可以关闭eslint语法检查。
6. 关于react中```
```的checked属性与defaultChecked
1.checked属性,时时刻刻起作用,而且必须配合disabled或onChange使用,否则就不能改了。
2.defaultChecked属性,只起一次作用,可以单独使用 (不建议使用)
7. 关于父子之间通信:
1.【父组件】给【子组件】传递数据:通过props传递。
2.【子组件】给【父组件】传递数据:通过props传递,(要求父提前给子传递一个函数)。
8. 熟练使用数组的reduce方法。
## 6.配置代理
### 方法一
> 在package.json中追加如下配置
```json
"proxy":"http://localhost:5000"
```
说明:
1. 优点:配置简单,前端请求资源时可以不加任何前缀。
2. 缺点:不能配置多个代理,不能够灵活的控制请求是否转发。
3. 工作方式:上述方式配置代理,当用Ajax请求了3000不存在的资源时,那么该请求会转发给5000 (优先匹配前端资源)
### 方法二
1. 第一步:创建代理配置文件
```
在src下创建配置文件:src/setupProxy.js
```
2. 编写setupProxy.js配置具体代理规则:
```js
const proxy = require('http-proxy-middleware')
module.exports = function(app) {
app.use(
proxy('/api1', { //api1是需要转发的请求(所有带有/api1前缀的请求都会转发给5000)
target: 'http://localhost:5000', //配置转发目标地址(能返回数据的服务器地址)
changeOrigin: true, //控制服务器接收到的请求头中host字段的值
/*
changeOrigin设置为true时,服务器收到的请求头中的host为:localhost:5000
changeOrigin设置为false时,服务器收到的请求头中的host为:localhost:3000
changeOrigin默认值为false,但我们一般将changeOrigin值设为true
*/
pathRewrite: {'^/api1': ''} //去除请求前缀,保证交给后台服务器的是正常请求地址(必须配置)
}),
proxy('/api2', {
target: 'http://localhost:5001',
changeOrigin: true,
pathRewrite: {'^/api2': ''}
})
)
}
```
说明:
1. 优点:可以配置多个代理,可以灵活的控制请求是否转发。
2. 缺点:配置繁琐,前端请求资源时必须加前缀。
## 7.消息订阅与发布
1. 先订阅,再发布(理解:有一种隔空对话的感觉)
2. 适用于任意组件间通信
3. ```componentDidMount```中订阅消息,```componentWillUnmount```中取消订阅
4. 具体编码:
1. 需要数据的组件中订阅消息:
```js
import PubSub from 'pubsub-js'
//......
componentDidMount(){
//订阅消息
this.pid = PubSub.subscribe('peiqi',(_,data)=>{
console.log('我是Weather组件,我收到了数据:',data)
this.setState({name:data})
})
}
//......
componentWillUnmount(){
PubSub.unsubscribe(this.pid)
}
```
2. 提供数据的组件中发布消息:
```js
PubSub.publish('peiqi',this.state.name)
```
## 8.路由的基本使用
1. 明确好界面中的导航区、展示区
2. 导航区的a标签改为Link标签
```html
Demo
```
3. 展示区写Route标签进行路径的匹配
```html
```
4. ``````的最外侧包裹了一个``````或``````
## 9.NavLink与封装NavLink
NavLink可以实现路由链接的高亮,通过activeClassName指定样式名
## 10.路由组件与一般组件
1. 写法不同:
一般组件:``````
路由组件:``````
2. 存放位置不同:
一般组件:```components文件夹```
路由组件:```pages文件夹```
3. 接收到的props不同:
一般组件:写组件标签时传递了什么,就能收到什么。
路由组件:接收到三个固定的属性,分别是:
history:
go: ƒ go(n)
goBack: ƒ goBack()
goForward: ƒ goForward()
push: ƒ push(path, state)
replace: ƒ replace(path, state)
location:
pathname: "/about"
search: ""
state: undefined
match:
params: {}
path: "/about"
url: "/about"
## 11.样式丢失的问题
当路由出现多层级时,可能会出现第三方样式丢失问题,解决方案如下:
1. public/index.html 中 引入样式时不写``` ./ ```写 ```/ ```
2. public/index.html 中 引入样式时不写 ```./ ```写 ```%PUBLIC_URL%```
3. 使用```HashRouter```
## 12.严格匹配与模糊匹配
1. 默认使用的是模糊匹配(简单记:【输入的路径】必须包含要【匹配的路径】,且顺序要一致)
2. 开启严格匹配:``````
3. 严格匹配不要随便开启,需要再开,否则会导致无法继续匹配二级路由
## 13.嵌套路由
1. 注册子路由时要写上父路由的path值
2. 路由的匹配是按照顺序进行的
## 14.路由组件的参数
1. params参数
路由链接(携带参数):```详情```
注册路由(声明接收):``````
接收参数:```this.props.match.params```
2. search参数
路由链接(携带参数):```详情```
注册路由(无需声明,正常注册即可):``````
接收参数:```this.props.location.search```
备注:获取到的search是urlencoded编码字符串,需要借助```querystring```解析
3. state参数
路由链接(携带参数):```详情```
注册路由(无需声明,正常注册即可):``````
接收参数:```this.props.location.state```
备注:刷新也可以保留住参数
## 15.编程式路由导航
借助this.prosp.history对象上的API对操作路由跳转、前进、后退
- this.prosp.history.push()
- this.prosp.history.replace()
- this.prosp.history.goBack()
- this.prosp.history.go()
## 16.BrowserRouter与HashRouter的区别
1. 底层原理不一样:
BrowserRouter使用的是H5的history API,不兼容IE9及以下版本。
HashRouter使用的是URL的哈希值。
2. path表现形式不一样
BrowserRouter的路径中没有#,例如:localhost:3000/demo/test
HashRouter的路径包含#,例如:localhost:3000/#/demo/test
3. 刷新后对路由state参数的影响
BrowserRouter没有任何影响,因为state保存在history对象中。
HashRouter刷新后会导致路由state参数的丢失!!!
4. 备注:HashRouter可以解决样式丢失问题