集成 element-plus
Element Plus,一套为开发者、设计师和产品经理准备的基于 Vue 3.0 的桌面端组件库:
-
相信很多同学在Vue2中都使用过element-ui,而element-plus正是element-ui针对于vue3开发的一个UI组件库;
-
它的使用方式和很多其他的组件库是一样的,所以学会element-plus,其他类似于ant-design-vue、NaiveUI、VantUI都是差不多的;
-
安装:
npm install element-plus
使用element-plus(全局引用)
把所有的组件,全部集成,也就是打包的时候,会被全部打包、造成包的占用资源过大、但是操作很简单
// main.ts
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')
使用
//使用
<el-button></el-button>
//引入自己具体想用的组件
ipmort {ElButton} from 'element-plus'
export default defineComponent({
//全局引用,已经不需要再注册组件了
//直接使用ElButton组件即可
})
自动引用element-plus
官方推荐
首先你需要安装
unplugin-vue-components和unplugin-auto-import这两款插件npm install -D unplugin-vue-components unplugin-auto-import 具体配置可以分别在vite和webpack,这里我们只说webpack的,详细请参照: element-plus.gitee.io/zh-CN/guide…
在vue.config.js中配置,他也是可以汇聚到webpack中的,在vueconfig.js中配置会更方便
// webpack.config.js
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')
module.exports = {
// ...
plugins: [
AutoImport({
resolvers: [ElementPlusResolver()],
}),
Components({
resolvers: [ElementPlusResolver()],
}),
],
}
配置完成后,直接使用即可,也不需要注册,也不需要引用
引用axios
axios请求是异步的!,设置成同步的方式:在第一个请求回来的then中发送第二个请求;或者使用await 首先安装
npm install axios --saveaxios_demo.ts
import axios from 'axios'//引用axios
//引用进来的axios就是 axois的实例对象了,可以直接调用他里面的方法
axios.request({ //请求 使用的是 GET方式 请求
method:'GET',
url:'http://123.207.32.32:8000/home/multidata'
})
等价于==》
axios.get("http://123.207.32.32:8000/home/multidata")
promise本身是可以有 类型的
new Promise((resolve,reject)=>{
resolve('123')
}).then(res)=>{
//res拿到的是resolve返回的数据
//但是我resolve出来的类型可能会有很多,需要我们手工指定
}
--------------------------------------------
/手工指定传入string
new Promise<string>((resolve,reject)=>{
resolve('123')//这里就必须传string类型
}).then(res)=>{//这里res就一定是string类型了
console.log(res.length)
}
axios.get的理解
//axios.get返回的是一个promise
//这里直接返回res,因为内部会帮我们返回resolve的
axios.get("http://123.207.32.32:8000/home/multidata").then((res)=>{
//then((res:AxiosResponse: <any>)=>
console.log(res)//返回 该url的数据,具体数据类型参照如下源码:
})
其实res是一个接口类型的,不过我们可以不用写,他会自动推导出来的。
export interface AxiosResponse<T = any, D = any> {
data: T;
status: number;
statusText: string;
headers: AxiosResponseHeaders;
config: AxiosRequestConfig<D>;
request?: any;
}
要求传入AxiosResponse接口中定义的所有属性、并且属性值类型是any类型
axios综合写法
get的请求的两个参数,第二个参数是一个对象,可以传参
设置的参数会存储在接口的data属性中
axios.get('http://www.httpbin.org/#/HTTP_Methods/get_get',{
params:{
name:'coderwhy',
age:18
}
}).then((res)=>{
console.log(res.data)
})
post请求 他的设置参数data会放在接口的data属性中
axios.post('http://www.httpbin.org/#/HTTP_Methods/post_post',{
data:{
name:'abc',
age:20
}
})
axios的全局配置选项
设置默认的根路径,这样我每次post/get的时候,就不用在写那么长的接口地址了。因为我们发现上方的get和post请求的时候,url有相同的地方,也就是根路径: “www.httpbin.org/#/HTTP_Meth…
设置这个之后就不用再写那么长的地址了。
axios.defaults.baseURL = 'www.httpbin.org/#/HTTP_Meth…' 改写为:
直接写后缀就完事了,相同的部分不用再写了。
axios.post('/post_post',{})
axios.get('/get_get',{})
axios.defaults...这样配置的是全局配置,可以配置如下:
axios.defaults.baseURL
axios.defaults.timeout
axios请求的局部配置
axios.get('/get',{
params:{
},
timeout:
headers:{
}
})
写在里面了,配置选项和全局配置一样。
请求函数axios.all
get和post的请求是异步的,他们俩到底谁先得到请求后返回的结果,我们是不确定的;在开发中,有多个请求,我们希望请求一起返回回来、这个时候就需要使用axios.all函数了
//要求传入一个数组,返回promise
axios.all([
axios.get('/get',{params:{name:"why",age:18}}),
axios.post('/post',{data:{name:"abc",age:20}})
]).then(res => {
console.log(res[0])//第一个请求返回的结果
console.log(res[1])//第二个请求返回的结果
res[0].data//服务器中真实的数据
})
axios的拦截器
token:服务端生成的一串字符串可以解决频繁登录的问题
它作为客户端进行请求的一个令牌:
第一次登录后,服务器生成一个token返回给客户端;
客户端只需要带上token来请求数据即可,无需再次带上用户名和密码
在我们发送请求之前,会做的一些事情。
比如:
1.每一个请求都携带了token,这个时候在请求之前,我们就需要将token存放在header属性中,所以拦截器将请求拦截下来,先往里面存储token属性后,才给与发送请求。
2.请求的时间过长时,我们在界面上显示一个loading的提示,等请求结束后,再把loading提示移除。所以我们就需要在每次请求之前把loading组件显示出来,请求结束后再移除loading组件。
3.每次请求后得到的相应数据都是AxiosResponse.data里面的数据,我们希望不用通过.data就可以直接拿到数据,那么我们可以在返回的时候进行拦截,直接获取到数据,不用再手工.data获取,也会用到拦截器。
axios.interceptors.request.use() 拦截请求
axios.interceptors.response.use() 拦截响应
//fn1:请求发送成功的时候,会执行的函数
//fn2:请求发送失败的时候,会执行的函数
axios.interceptors.request.use(fn1,fn2)
请求使用:
//拦截
axios.interceptors.request.use((config)=>{
//config:请求成功会就会执行他
//config中存储了我们get('')中的配置信息
//可以对这些配置信息进行相应的修改
config.url = '...'
return config
//因为我是拦截的,我操作完后还是要返回出去,给他继续请求的
},(err)=>{
//当请求发送失败的时候,会执行他
console.log("请求发生错误")
return err
}),
响应使用:
axios.interceptors.response.use((res=>{
//服务器正常返回值(数据响应成功)会执行
//一般服务器状态是20x表示成功
return res.data
//直接返回res.data,我就不需要再通过.data拿到数据了
}),(err=>{
//服务器没有返回相应的值(数据响应失败)会执行
return err
})
)
区分不同环境
在不同的环境中,我们会存在不同的BASE_URL;有三种方式可以进行修改。
/service/request/config.ts\
1.手动修改(不好)
//每次在这里修改,当我npm run serve,设置成对应的
当我 npm run build,又要设置成相应的
const BASE_URL = 'http://abc'
在不同的环境中每次都要修改这个
2.根据process.env.NODE_ENV
在不同的环境下,process.env.NODE_ENV有不同的值
- 开发环境:development
- 生产环境:production
- 测试环境:test
let BASE_URL = ''
let BASE_NAME = ''
if(process.env.NODE_ENV === 'development'){
BASE_URL = '开发环境的地址'
BASE_NAME = '开发环境的名字'
}else if(process.env.NODE_ENV === 'production'){
BASE_URL = '生产环境的地址'
BASE_NAME = '生产环境的名字'
}else {
BASE_URL = '测试环境的地址'
BASE_NAME = '测试环境的名字'
}
//需要将他导出
export { BASE_URL,BASE_NAME }
关于publicPath的问题:blog.csdn.net/qq_42991509…