# s_1809A_gao6
**Repository Path**: wyp0712/s_1809A_gao6
## Basic Information
- **Project Name**: s_1809A_gao6
- **Description**: No description available
- **Primary Language**: JavaScript
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-04-19
- **Last Updated**: 2025-01-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# s_1809A_gao6
## day1 js运行原理
## day2
1. 配置用户名 git config --global user.name "your name"
2. 配置用户邮箱 git config --global user.email "your_email@youremail.com"
3. 生成密钥 ssh-keygen -t rsa -C "1240847112@example.com"
4. 找到密钥 .ssh文件夹中的 id_rsa.pub 粘贴其中的代码,放置在 github gitlab 码云下的设置中的配置ssh的地方;
cat ~/.ssh/id_rsa.pub
- git (`所有的git操作之前请一定先 清空工作区域`)
1. 创建仓库
2. 克隆仓库
git status 查看当前文件修改状态
git add . /单个文件或者多个文件名字
git commit -m "add"
- add: 新增文件 将工作区域文件 提交到暂存区域
- remove: 删除文件或者功能 将暂存区域文件 提交到本地仓库
- update: 更新文件或者功能
- batch: 批量修改文件
git pull 先拉取后推送
git push 将本地仓库代码文件 提交到远程仓库
- 编辑器源代码管理工具操作 git;
1. 黄色 代表修改
2. 绿色 代表新增
3. 紫色 代表冲突 (多了一种操作,手动修改当前的冲突,然后提交)
- 分支操作
创建分支
git checkout -b feture_student
切换分支
删除分支
- 分支命名:
master - 主线分支
feature 功能分支 feature_student
release_01 发布分支
release_02
project 项目分支 project_qingdao
项目上线之后
fix 修复分支
## day3
vue 数据双向绑定原理
写代码:
1. 关注数据(接口)
2. 关注ui视图(组件)
- 基础组件
- 业务组件(交互) --- 触发方法
3. actions/mutaions
- 组件传参:
1. 关注数据 data() {}
2. 关注ui
3. 组件传参:(数据往下流、逻辑往上走)
数据往下流 父传子(单向数据流)
逻辑往上走 子传父 ($emit,所有的逻辑都交给父组件处理)
**api封装和axios二次封装**
****
## day4:
**require.context**
1. 定义:webpack的api,自动全局注册,组件,
```js
const requireComponent = require.context(
'./echarts',// 其组件目录的相对路径
false,// 是否查询其子目录
/[A-Z]\w+\.(vue|js)$/, // 匹配基础组件文件名的正则表达式
)
requireComponent.keys().forEach(fileName => {
const componentConfig = requireComponent(fileName)
// 获取组件的 PascalCase 命名
const componentName = fileName.split('/').pop().replace(/\.\w+$/, '')
// 全局注册组件
Vue.component(
componentName,
componentConfig.default || componentConfig
)
})
```
功能:
- 全局注册图表组件
- svg-icon (svg-sprite-loader)(不做要求)
**Vue.use 这个组件的注册他干了什么?**
import ElementUi from ''
Vue.use()
vue.use讲解自动调用install方法
1. 封装一个toast轻提示组件
- 如何调用toast/message组件
vue.component
this.$message.show('')
Vue.prototype.$message = {
show() {},
hide() {}
}
- 以上两种调用方式,需要通过Vue.use进行统一处理
Vue.use自动调用一个install方法
**font字体引入**
h5新特性:@font-face {} 服务端字体
**image组件封装**
基础组件:imageview / button / input / select / icon
业务组件:form table page search upload carousel ....
**vuex模块化**
1. module
namespaced: true, 命名空间
state: {}....
## day4-react-ts
#### typescript
1. 定义: ts是js的一个超集;
2. 作用:类型规范(interface/type/泛型)
**ts运行环境讲解**
npm i typescript -g
tsc -v
npm i ts-node -g
ts-node -v
初始化生成ts运行环境
tsc --init
/**
* ts的类型校验功能
*
* 1. 数据类型 (基本 引用)
* 2. 函数数组
* 3. @修饰器
*/
#### create-react-app ts-app
下载自带的react ts框架
create-react-app react-ts --template typesript
1. 路由导航与原生浏览器操作一致 hash history
2. 路由的路径解析原理与原生浏览器一致,可以自动识别url
3. 路径的切换以页面为单位,不要页面堆叠
#### hooks
## day5
**react Hook**
- react hook 代替两个东西:
1. 状态
2. 生命周期
- react hook形式:
useState: 获取状态,设置状态
useEffect: 生命周期,watch
useRef: 操作dom
useContext: 嵌套组件传值
useReducer (useState):
优化:一般优化子组件的不相关的render;
useMemo: 包装逻辑,优化逻辑
useCallback:优化函数返回值(回调函数-传入了子组件) (优化useMemo的书写形式)
自定义Hook: 以use开头的一个函数;
1. todo-list案例
2. 组件优化
- react 组件代码组织规范:
一个文件夹:
1. 导出文件 index.ts
2. 多个组件文件
3. css样式文件:styled-components (css in js 方案)
- react hook 文档:
https://www.jianshu.com/p/1252be39c702?from=timeline
**移动端页面适配**
html ===> rem:相对单位:(定义:是一个根据根节点字体大小变化而变化的一个字体单位)
html {
font-size: 250px;
}
250px = 1rem
**组件懒加载(路由)**
## day6
1. typescript
推断类型(自带的)
**注解类型**
1. 注解方式:接口注解/type注解/泛型注解
2. 注解文件类型 index.d.ts
**注解ts类型规律总结**
3. 注解都在源头上,(定义的时候,就要注解)
4. 注解如果在操作上,特殊情况可以使用断言方式,(indom as any)
5. 如果涉及到后端传递过了的数据,可以使用any注解: any[]
**redux: / react-redux / redux-thunk / redux-saga**
1. 三大原则:
- 单一数据源
- 数据只读()
- 需要通过reducer纯函数修改(什么是纯函数,为什么return一个新地址对象)
redux跟组件的数据没有关系
## day7:
(redux关联-国际化-登陆-业务场景)
**i18n**
语言切换功能完成
i nternationalizatio n 国际化:
- 原理:
1. 将语言包作为静态资源单独保存在项目中,xml/json格式 (估工期)
2. 每一种语言对应一个文件
3. 切换语言设置,随之更改语言文件 (redux/vuex/dva/mobx)
- I18n工具
1. i18next: 目前的主流框架(vue-i18n)
2. react-i18next: i18next的react插件
- 使用:
1. npm i i18next react-i18next -S
**redux完成语言切换功能**
1. 两种组件
- class组件 withTranslation WithTranslation
WithTranslation: 注解文件 跟其他的注解文件是平行关系
withTranslation: 将当前的props中,注入t函数
class Header extends React.Components
// 联合类型
Parcel
如果要先使用路由功能,再使用i18n功能,
withTranslation()( withRouter(HeaderComponent) )
- FC组件:useTranslation
const { t } = useTranslation();
- 关联redux功能实现语言切换;
class组件: react-redux { connect }
FC组件:
import { useSelector } from 'react-redux'
const {} = useSelector((s: 解决详细注解s参数问题?) => s.store)
- 如何注解useSelector中的store参数; (优化手段)
如果要注解一个东西。就必须明白当前的这个东西到底是干什么用的?
1. useSelector的作用是取数据(store.getState())
2. 说明我当前想要的是store.getState的返回值,
3. 可以使用ts提供的一个反向注入ReturnType
4. 在store文件中。定义type RootState = 并且抛出;
5. 每次在引入的时候,都取拿上store文件中的RootState去注解组件,会造成组件和store数据的耦合。
6. 为了解决以上问题,引入了一个自定义Hook文件,hooks。
```js
// redux/store.ts
export type RootState = ReturnType
// redux/hooks.ts
import {
useSelector as useReduxSelector,
TypedUseSelectorHook } from 'react-redux'
import { RootState } from './store'
// 包装一个已经注解好的useSelector,然后抛出。这样子在组件内部就可以不用每次跟store数据耦合了
export const useSelector:TypedUseSelectorHook = useReduxSelector;
```
**class组件**
**函数组件**
## 安排:
1. 微信读书案例;
2. 组件库封装: ts -> pc组件库
- 基础组件
Button
icon
menu
upload
- 业务组件
3. zarm / antd-moile
4. dva学习:redux + react-rouder + fetch (redux-saga)
5. umi学习:dva + antd + antd-mobile ....
- 路由
```js
import { useDispatch, useHistory } from 'umi';
```
## 微信读书:(组件/功能开发/接口)
1. 分组弹出框 0.5
2. 封装一个图片基础组件 0.5
3. 页面:书架页面 2
1. 编辑/分组 1
4 + 2 = 6;
工程组织:
pages/views
components
store
hooks
utils
api
header
- index.ts
- Header.tsx
- .scss/css/styled-components
server + nginx部署 (egg)
官网 - 贝壳找房/旅游网/易车网
1. 图片
2. 轮播图
3. 按条件搜索
后台系统:
前台展示系统:
## day9:
设计模式:一种经验总结;24种设计模式;
观察者 模式:最重要;
face: 观察者模式 和 发布订阅模式?
scss: 局部文件命名以_sass命名
_style.scss 引入不需要加_
**icon-fon字体网站**
https://fontawesome.com/how-to-use/on-the-web/using-with/react
button组件封装,
icon组件封装
**icon字体演变**
1. 精灵图 ---> png
2. font-icon ---> svg
## umi-app
1. 路由(约定路由/配置路由)
2. redux () - saga - dva
3. 配置 --侧边antd / 权限路由配置(navLink+token)
4. 自定义hook
## 微信小程序:
`https://mp.weixin.qq.com/`
1. 注册小程序 ()
2. 下载微信开发者工具
3. 进入微信公众开发平台 (选小程序)
4. 查找用户的appId
## umi-app
1. 路由 (配置/约定)
2. dva(redux (redux-saga) 异步)
3. 插件机制
4. 自定义hook dva umi { useDispatch, useHistory, useSelector } from 'umi';
## 数据流解决方案(状态管理器)
vuex
redux
dva
mobx
#### mobx 数据流解决方案:
1. 存数据
2. 取数据
3. 更新数据 (更新ui渲染)
实现以上三种的方式不同?
1. 可观测 数据
2. 可观测 行为
3. 更新数据
安装方式:
1. tyarn add mobx
2. tyarn add mobx-react
3. 开启装饰器模式 @ --- class组件上
原理:任何源自应用状态的东西都应该自动地获得。
- mobx数据流解决方案步骤
1. 定义可观测的数据 class observable
2. 定义一个可观测的组件 observer
3. 定义一个可观测的行为;?action
store ---- -----
| |
| |
| |
ui渲染 ------ 可观测行为
### nginx:反向代理,静态资源
1. 静态资源服务器?
html/css/js/img/video/audio.... 网站 --- 发布
2. 服务器要能读取网站的所有资源, java/php(phpmyadmin) www/
3. node服务器 http.createServer((req, res) => {})
proxy: { 代理 }
4. nginx 静态资源读取服务器 / 反向代理
mac电脑安装nginx (brew install nginx)
#### 服务器上:
1. 前端代码
vue/react
2. egg-server代码
egg
3. 跨域问题:同端口/同协议/同域名 (浏览器)
4. 服务端接口跨域 cors() 加了一个头 Access-cltrol-allow-origin: 47.101.45.245
axios二次封装
axios.craete({
baseURL: 'http://47.101.45.245:7001'
})
axios.get('/api/user')
#### json-server 静态资源服务器: mongdb
1. 支持restFul api
#### 大屏拖拽:
- 工具构成:
1. 技术栈:react + mobx + react-beautiful-dnd + echarts/hightcarts/datav + grid布局 + json
2. 功能点分析:
- 组件可拖拽
- 布局可控制(row col) dnd ---> json ----> grid (24 / 24 -> 12/24 -> 8/24)
- 样式:
- 要求每个组件都是-可拖拽实现的
- 要求可以动态获取当前组件的-数据
- 要求当前大屏数据可视化的布局,可定制,row col --> json
- 数据:
onDragEnd(item) {
return
}
3. - 要求数据可设置:(展示数据-/富文本编辑json) 弹出框展示
## umi-app;
#### 权限场景:
**路由级别的权限**
核心处理路由表:
umi-app: 处理侧边栏的a标签; 渲染
[
{
path: '/amdin'
},
{
path: '/posts'
}
]
http://localhost:8080/posts 404页面 / 403页面
基于token做一个导航守卫功能;
```js
const routes = [
{
path: '/amdin',
auth: [0, 1],
children: [
{
path: '/amdin',
auth: [0,1],
}
]
},
{
path: '/posts',
auth: [0]
}
]
1. 定义路由表权限字段
2. 封装一个递归的过滤函数
const filterRoutes = (routes, userId) => {
// 1. 处理第一层数据
const filterArr = routes.filter(v => v.auth.indexOf(userId) !== -1)
filterArr.forEach(item => {
item.children = (item.children && item.chidlren.length && filterRoutes(item.children, userId))
})
return filterArr;
}
// userId : 0
const filterRoutes = filterRoutes(routes, 0)
```
3. vue框架。
- Router.addRoutes(filterRoutes)
- react 数组操作就可以了
// js
const config = () => {
return {
[
]
}
}
// json
[{}] JSON.parse(JSON.stringify())
**组件级别的权限**
组件 --- data ---
HOC()
自定义Hook
const useMyComponent = (userId) => {
if(userid === 1) {
} else {
}
return []
}
cosnt [] = useMyComponent(icon)
data.map(item => {
return HOC(itme.auth)()/> HOC(item.auth)(< />)/>
})
#### jira 项目 (管理项目/管理人员/管理接口)
- 技术栈:umi + echarts + dnd
- 安装包:react-beautiful-dnd / antd / echarts / highcharts / datav
- 功能点分析:
1. 项目过滤/负责人过滤
2. 项目拖拽/项目看板
#### 错误边界:
定义:部分 UI 的 JavaScript 错误不应该导致整个应用崩溃,为了解决这个问题,React 16 引入了一个新的概念 —— 错误边界。
`解释:一处js代码错误,可能会导致整体react渲染树被卸载掉,出现了一个大白屏效果,用户体验比较差,导致客户流失,为了解决这个问题,有了错误边界`
特点:捕捉ui渲染错误,不能捕捉异步错误
方式:生命周期捕捉
```js
// 负责捕捉 ui错误, 不能在当前的生命周期中放置异步方法
static getDerivedStateFromError(error) {
return { error: true }
}
// 可以在生命周期中放置异步方法
componentDidCatch(error, errorInfo) {
// 你同样可以将错误日志上报给服务器
// logErrorToMyService(error, errorInfo);
}
```
使用场景:
1. 开发环境不需要,
2. 一般 上线之后解决捕捉错误提示
(上线之后)
1. 错误边界
2. ...
#### 错误捕捉总结:
错误类型:
1. 工程化错误 (配置错误)
2. 组件渲染错误(代码错误)
3. 接口错误 (后台异步请求错误)
解决方案:
1. 通过webpack配置解决 devtools调试模式/可以进行node层面的错误捕捉
2. 组件渲染错误捕捉(错误边界(生命周期-参与渲染) / ts强类型注解
3. promise .catch / axios二次封装捕捉错误状态码
html页面错误:
1. 层级错误(定位,脱离文档流)
2. 优先级错误 class id span
3. ui样式错误:样式穿透 sass/less/stylus
span
width: 100px
height: 100px
a
color: red
#### vue3语法:
**合成api compositionAPI**
- 组件 sfc组件
- setup函数写法 setup(props, context) { }没有this
- 数据写法
ref 基本类型
reactive 引用类型
- 路由写法
useRouter
useRoute
- 仓库写法
useStore
- 生命周期 onMounted ....
- 组件传值
### tsx写法
index.vue --sfc-- index.tsx/jsx
import {} from 'vue'