TS项目总结
1.项目的搭建及配置
1.1使用vite来创建项目时
兼容性注意 Vite 需要 Node.js 版本 14.18+,16+。然而,有些模板需要依赖更高的 Node 版本才能正常运行,当你的包管理器发出警告时,请注意升级你的 Node 版本
启动命令以及相关内容具体看vite官网
1.2浏览器自动打开
找到 package.json 配置文件!
"scripts": {
"dev": "vite --open",
"build": "vue-tsc && vite build",
"preview": "vite preview"
}
1.3 src 别名的配置
找到 vite.config.ts 配置文件。
如果红色语法提示请安装@types/node 是 TypeScript 的一个声明文件包,用于描述 Node.js 核心模块和常用的第三方库的类型信息
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: {
"@": path.resolve(__dirname, 'src')
}
}
})
找到tsconfig.json
配置文件,找到配置项 compilerOptions 添加配置,这一步的作用是让 IDE 可以对路径进行智能提示
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
2.LESS 和 SCSS 的区别
相同点:
-
LESS和SCSS都是css的预处理器,可以拥有变量,运算,继承,嵌套的功能,使用两者可以使代码更加的便于阅读和维护。
-
都可以通过自带的插件,转成相对应的css文件。
-
都可以参数混入,可以传递参数的class,就像函数一样
-
嵌套的规则相同,都是class嵌套class
不同点:
1.声明和使用变量
LESS用@符号,SCSS用$符号表示
2.变量插值
LESS采用@{XXXX}的形式,SCSS采用${XXXX}的形式
作用: 可以用为LESS和SCSS声明变量,变量作为css的选择器
3. SCSS支持条件语句,LESS不支持
SCSS可以使用if{}else,for循环等等,LESS不支持
4.应用外部css文件方式不同
SCSS应用的css文件名必须以‘_’开头(下划线),文件名如果以下划线开头的话,sass会认为改文件是一个应用文件,不会将它转成css文件
5.引用父选择器&符号的使用
LESS和SCSS都可以使用&符号表示父选择器,但是SCSS的&符号只能出现在一个组合选择器的开始位置,LESS则没有这个限制
3.封装组件
在src中创建一个文件夹,在main.ts中去引用, import ... from "...."
在利用createApp方法创建应用实例,且将应用实例挂载到挂载点上
const app = createApp(App);
app .component("XXX', XXX);
在相关页面使用: <XXX />
在xx.vue中去使用时直接引入就行
import ... from "...."
在相关页面使用: <XXX />
4.路由
命令 pnpm i vue-router
相关配置:
在main.ts中:
//引入vue-router核心插件并安装
import router from "@/router";
//安装vue-router
app.use(router);
在vue2中使用的是vue.use,在vue3中没有了构造函数,用的是实例
//滚动行为:控制滚动条的位置,让其每跳转一次页面,滚动条会在顶部
scrollBehavior() {
return {
left: 0,
top: 0
}
}
5.深度选择器
分为三种: 1.css原生,使用 >>> 深度选择器来修改 外用第三方组件的样式
2.less,使用/deep/ 深度选择器来修改 外用第三方组件的样式
3.scss, ::v-deep 深度选择器来修改 外用第三方组件的样式
注意: ① 操作符 >>> 可能会因为无法编译而报错,可以使用 /deep/ ② vue3.0 中使用 /deep/ 会报错,更推荐使用 ::v-deep ③ 对于使用了 css 预处理器(scss 、sass、 less)时,深度选择器 ::v-deep 比较通用
6.AXIOS二次封装
// 对于axios函数库进行二次封装
// 你工作的时候是否axios进行二次封装?二次封装的目的是什么
// axios的目的1.请求,响应拦截器功能
// 2.请求拦截器,一般可以在请求头中携带公共的参数:token
// 3.响应拦截器,可以简化服务器返回的数据,处理http网路错误
const request = axios.create({
baseURL: "/api", //请求的基础路径的设置
timeout: 5000, //超时的时间的设置,超出五秒请求就是失败的
});
// 请求拦截器
request.interceptors.request.use((config) => {
// 获取用户仓库
let userStore = useUserStore();
// tokne是公共参数
if(userStore.userInfo.token){
config.headers.token = userStore.userInfo.token;
}
// config:请求拦截器回调注入的对象(配置对象),配置对象的身上最重要的一件事情headers属性
// 可以通过请求头携带公共参数-token
return config;
});
// 响应拦截器
request.interceptors.response.use(
// 相应拦截器成功的回调,一般会进行简化数据
(response) => {
return response.data;
},
(error) => {
let status = error.response.status;
switch (status) {
case 404:
ElMessage({
type: "error",
message: "请求失败路径出现问题",
});
break;
case 500 | 501 | 502 | 503 | 504 | 505:
ElMessage({
type: "error",
message: "服务器挂了",
});
break;
}
return Promise.reject(new Error(error.message));
}
);export default request;
7.跨域代理
//配置跨域代理
server:{
proxy:{
'/api': {
target: 'http://syt.atguigu.cn',
changeOrigin: true,
},
}
}
配置完成后重启项目
8.渲染图片
首先,一般来说,当请求图片的接口时,会返回一个数组,这个数组里会是一些图片的名字
图片地址的构成是http地址+图片名,这里要注意的是拼接src的地址,如果不用变量存起来,就只有原本的第一个div有这个地址,后面循环出的则只有图片名。
vue 中的img 的src 可以动态绑定,使用模板字符串来拼接,${写后台数据的路径}例如:
9.定义接口TS类型
在我们写ts项目时需要给接口定义类型,如下是一个接口,并且还需要传一个参数
新建一个ts文件来定义他的类型:
代表的是医院的等级或者地区数据ts类型,里面的数据是与后台的接口相对应的
定义一个数组来接受数据
定义一个接口类型来约束接口,并将数据传给我们定义的数组
这边继承的是ResponseData,因为接口返回的数据要有ResponseData中的数据, 已下是ResponseData中的数据
10.async和await
-
async 是异步的意思,await则可以理解为 async wait。所以可以理解async就是用来声明一个异步方法,而 await是用来等待异步方法执行
-
async作为一个关键字放在函数前面,表示该函数是一个异步函数,异步函数意味着该函数的执行不会阻塞后面代码的执行;而 await 用于等待一个异步方法执行完成;
-
当函数内部执行到一个 await 语句的时候,如果语句返回一个 promise 对象,那么函数将会等待 promise 对象的状态变为 resolve 后再继续往下执行。并会阻塞该函数内后面的代码。
-
因此async/await的作用就是将异步逻辑,转化为同步的顺序来书写,并且这个函数可以自动执行。
-
为了优化 .then 链而开发出来的。
-
简而言之,async用于申明一个function是异步的;而await则可以认为是 async await的简写形式,是等待一个异步方法执行完成的。
async/awiat的使用规则:
async 表示这是一个async函数, await只能用在async函数里面,不能单独使用 async 返回的是一个Promise对象,await就是等待这个promise的返回结果后,再继续执行 await 等待的是一个Promise对象,后面必须跟一个Promise对象,但是不必写then(),直接就可以得到返回值
async/await的特点
1、Async作为关键字放在函数前面,普通函数变成了异步函数
2、异步函数async函数调用,跟普通函数调用方式一样。在一个函数前面加上async,变成 async函数,异步函数,return:1,打印返回值,
3、返回的是promise成功的对象,
4、Async函数配合await关键字使用
总结:
async 函数
1)函数的返回值为Promise对象
2)Promise对象的结果由async函数执行的返回值决定
await 表达式
1)正常情况下,await右侧的表达式一般为 promise对象 , 但也可以是其它的值
2)如果表达式是promise对象,await就忙起来了,它会阻塞函数后面的代码,等着Promise对象resolve,然后得到resolve的值,作为await表达式的运算结果。
3)如果表达式是其它值, 直接将此值作为await的返回值 async和await基于promise的。使用async的函数将会始终返回一个 promise 对象。这一点很重要,要记住,可能是你遇到容易犯错的地方。 在使用await的时候我们只是暂停了函数,而非整段代码。这里经常会是容易犯错的地方。 async和await是非阻塞的
仍然可以使用 Promise,例如Promise.all(p1, p2, p3).,接受一个数组作为参数,p1、p2、p3 都是 Promise 实例,如果不是,就会先调用 Promise .resolve方法,将参数转为 Promise 实例,再进一步处理。只要 p1、p2、p3 之中有一个被 rejected,整个状态就变成 rejected。
注意
1)await必须写在async函数中, 但async函数中可以没有await
2)如果await的promise失败了, 就会抛出异常, 需要通过try…catch来捕获处理