Vue3旅途中的一些小知识
发表于|更新于
|字数总计:1.6k|阅读时长:6分钟|阅读量:
前言
最近在学习Vue3跟用node koa写后端,此篇文章是记录一些平时学习中的小知识点,未经整理,以后或许会整理一下。
很乱,但有很多都是当时最直接的想法
整理后也会在此挂上新链接的
还会一直更新
路由跳转的三种方式
router-link
| 1
 | <router-link to"/login">去登陆</router-link>
 | 
传统跳转(options API)
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 
 | <template><el-button @click="goLogin">去登陆</el-button>
 </template>
 <script>
 export default{
 name:'home',
 methods:{
 goLogin(){
 this.$router.push('/login')
 }
 }
 }
 </script>
 
 | 
Composition API跳转
| 12
 3
 4
 5
 6
 7
 
 | <script setup>import { useRouter } from 'vue-router'
 let router = userRouter()
 const goLogin = ()=>{
 router.push('/login')
 }
 </script>
 
 | 
注意:setup是钩子函数,如果像第三个例子写的话,里面的函数都属于钩子范畴,可以像第二种方式那样,setup类似于methods,完后将它return出去应该也是可以的。
下面为上面注意中,方法的实现代码
大体上还是options API的写法,只是setup的思想属于composition API范畴,应该属于框架迁移过程中的写法吧
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 
 | <template><el-button @click="goLogin">去登陆</el-button>
 </template>
 
 <script>
 import { useRouter } from 'vue-router'
 export default{
 setup(){
 let router = useRouter()
 function goLogin(){
 router.push('./login')
 }
 return { goLogin }
 }
 }
 </script>
 
 | 
封装两种习惯使用request
this.$request({ obj })
将参数用一个对象的方式进行解构。
| 12
 3
 4
 5
 6
 7
 8
 9
 
 | this.$request({methods: 'get',
 url: '/login',
 data:{
 name:'Ned'
 }
 }).then((res)=>{
 console.log(res)
 })
 
 | 
封装如下
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 
 | 
 
 import axios from 'axios'
 import config from './../config'
 import router from './../router';
 import { ElMessage } from 'element-plus'
 
 const TOKEN_INVALID = 'Token认证失败,请从新登陆'
 const NETWORK_ERROR = '网络请求异常,请稍后重试'
 
 
 const service = axios.create({
 baseURL:config.baseApi,
 timeout:8000
 })
 
 
 service.interceptors.request.use((req) => {
 
 const headers = req.headers
 if(!headers.Authorization) headers.Authorization = 'Bear token'
 return req
 })
 
 
 service.interceptors.response.use((res) => {
 
 
 
 
 
 
 const { code, data, msg } = res.data
 if(code === 200){
 return data
 }else if(code === 40001){
 ElMessage.error(TOKEN_INVALID)
 setTimeout(() => {
 router.push('/login')
 }, 15000);
 return Promise.reject(TOKEN_INVALID)
 }else{
 ElMessage.error(msg || NETWORK_ERROR)
 return Promise.reject(msg || NETWORK_ERROR)
 }
 })
 
 
 
 
 
 function request(options){
 
 options.method = options.method || 'get'
 
 if(options.method.toLowerCase() === 'get'){
 
 
 options.params = options.data;
 }
 if(config.env === 'prod'){
 service.defaults.baseURL = config.baseApi
 }else{
 service.defaults.baseURL = config.mock ? config.mockApi:config.baseApi
 }
 return service(options)
 }
 
 export default request
 
 | 
this.$request.get/post(‘/api’,{ obj })
将get/post用.的方式取出,一个参数是接口路径,另一个参数是数据对象。
| 12
 3
 
 | this.$request.get('/login',{name:Ned}).then((res)=>{console.log(res)
 })
 
 | 
在上一步的封装上,支持这种习惯
增加如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 
 | ['get','post','put','delete','patch'].forEach((item)=>{request[item] = (url,data,options) =>{
 return request({
 url,
 data,
 method:item,
 ...options
 })
 }
 })
 
 | 
环境配置
什么时候用到
开发环境:mock地址
测试环境:测试接口的地址
部署环境:线上接口的地址
mock的重要性
前后端分离的时候,mock可以帮助前端利用接口文档测试接口。
帮助前端完成开发
配置config
默认是生产环境 prod,如果有值就赋值到env变量上,当做当前的环境变量。
最后将EnvConfig以解构的方式导出,方便根据当前环境直接调取两种Api
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | const env = import.meta.env.MODE || 'prod'const EnvConfig = {
 dev:{
 baseApi:'',
 mockApi:''
 },
 test:{
 baseApi:'',
 mockApi:''
 },
 prod:{
 baseApi:'',
 mockApi:''
 }
 }
 export default {
 env:env,
 mock:true,
 ...EnvConfig[env]
 }
 
 | 
关于Storage使用场景
jwt token
在登陆时候,有一个状态,以及用token做一些权限、由访问权限等
跨组件数据共享
跨组件数据共享:
    Vue中使用Vuex
    React中使用Redux
存在问题:页面刷新后数据丢失
原因:Vuex存储数据在js内存中,刷新会销毁内存。
解决方案:Vuex+storage结合去做
storage存储
storage存储量:4M
cookie存储量:2K-4K
封装storage
- setItem()
- getItem()
- clearItem()
- clearAll()
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | import config from './../config'
 export default {
 setItem(key,val){
 let storage = this.getStorage()
 storage[key] = val
 window.localStorage.setItem(config.namespace,JSON.stringify(storage))
 },
 getItem(key){
 return this.getStorage()[key]
 },
 getStorage(){
 return  JSON.parse(window.localStorage.getItem(config.namespace)) || "{}"
 },
 clearItem(key){
 let storage = this.getStorage()
 delete storage[key]
 window.localStorage.setItem(config.namespace,JSON.stringify(storage))
 },
 clearAll(){
 window.localStorage.clear()
 }
 }
 
 | 
使用koa初始化项目
koa-generator快速生成koa服务的脚手架工具
1.1 全局安装脚手架工具
| 12
 3
 
 | cnpm install -g koa-generator # or
 yarn global add koa-generator
 
 | 
1.2 进入到项目文件夹目录,执行生成命令
| 12
 
 | # koa2+项目名koa2 manager-server
 
 | 
如果无法使用koa2命令,说明需要配置环境变量,window用户,需要找到koa-generator的安装目录,找到里面bin下面的koa2命令文件,然后配置到环境变量中。mac用户可直接创建软连接,指向到/usr/local/bin中,比如:ln -s /Users/Jack/.config/yarn/global/node_modules/koa-generator/bin/koa2 /usr/local/bin/koa2
1.3 安装依赖
| 12
 3
 4
 5
 
 | npm install # or
 cnpm install
 # or
 yarn
 
 | 
使用pm2部署Koa项目并实现启动、关闭、自动重启
1. 全局安装
2. 启动项目
进入项目目录,然后使用pm2启动项目。这里要特别注意:启动单文件时用(app.js是项目文件名)
但是在koa2中需要这样启动:
| 1
 | pm2 start ./bin/www #启动koa2项目
 | 
3. pm2自动重启
把pm2的服务先停下,然后起来的时候带上–watch就可以了
| 1
 | pm2 start ./bin/www --watch
 | 
4. 启动完成,可以访问了

5. pm2相关命令(www是项目名)
| 12
 3
 4
 5
 
 | pm2 list           #查看所用已启动项目pm2 start          #启动
 pm2 restart www    #重启
 pm2 stop www       #停止
 pm2 delete www     #删除
 
 |