来吧,解锁 vue3 全家桶+Ts 的正确姿势

const routes: Array< RouteRecordRaw > = [

{

path: ‘/’,

name: ‘Home’,

component: Home,

},

{

path: ‘/about’,

name: ‘About’,

component: () => import(/* webpackChunkName: “about” */ ‘…/views/About.vue’)

}

];

const router = createRouter({

history: createWebHistory(process.env.BASE_URL),

routes

});

export default router;

扩展路由额外属性

在实际项目开发中,常常会遇到这么一个场景,某一个路由是不需要渲染到侧边栏导航上的,此时我们可以给该路由添加一个hidden属性来实现。

在ts的强类型约束下,添加额外属性就会报错,那么我们就需要扩展RouteRecordRaw类型。

// 联合类型

type RouteConfig = RouteRecordRaw & {hidden?: boolean}; //hidden 是可选属性

const routes: Array = [

{

path: ‘/’,

name: ‘Home’,

component: Home,

hidden: true,

meta: {

permission: true,

icon: ‘’

}

}

];

在setup中使用

需要导入useRouter创建一个router实例。

vuex


使用this.$store

import { createStore } from ‘vuex’;

export type State = {

count: number

}

export default createStore({

state: {

count: 0

}

});

需要创建一个声明文件vuex.d.ts

// vuex.d.ts

import {ComponentCustomProperties} from ‘vue’;

import {Store} from ‘vuex’;

import {State} from ‘./store’

declare module ‘@vue/runtime-core’ {

interface ComponentCustomProperties {

$store: Store

}

}

在setup中使用

定义InjecktionKey

在安装插件时传入key

在使用useStore时传入

import { InjectionKey } from ‘vue’;

import { createStore, Store } from ‘vuex’;

export type State = {

count: number

}

// 创建一个injectionKey

export const key: InjectionKey<Store> = Symbol(‘key’);

// main.ts

import store, { key } from ‘./store’;

app.use(store, key);

模块

新增一个todo模块。导入的模块,需要是一个vuex中的interface Module的对象,接收两个泛型约束,第一个是该模块类型,第二个是根模块类型

// modules/todo.ts

import { Module } from ‘vuex’;

import { State } from ‘…/index.ts’;

type Todo = {

id: number,

name: string,

completed: boolean

}

const initialState = {

todos: [] as Todo[]

};

export type TodoState = typeof initialState;

export default {

namespaced: true,

state: initialState,

mutations: {

addTodo (state, payload: Todo) {

state.todos.push(payload);

}

}

} as Module<TodoState, State>; //Module<S, R> S 该模块类型 R根模块类型

// index.ts

export type State = {

count: number,

todo?: TodoState // 这里必须是可选,不然state会报错

}

export default createStore({

state: {

count: 0

}

modules: {

todo

}

});

使用:

setup () {

console.log(store.state.todo?.todos);

}

elementPlus


yarn add element-plus

完整引入

import { createApp } from ‘vue’

import ElementPlus from ‘element-plus’;import ‘element-plus/lib/theme-chalk/index.css’;import App from ‘./App.vue’;

import ‘dayjs/locale/zh-cn’

import locale from ‘element-plus/lib/locale/lang/zh-cn’

const app = createApp(App)

app.use(ElementPlus, { size: ‘small’, zIndex: 3000, locale })

app.mount(‘#app’)

按需加载

需要安装babel-plugin-component插件:

yarn add babel-plugin-component -D

// babel.config.js

plugins: [

[收起

‘component’,

{

libraryName: ‘element-plus’,

styleLibraryName: ‘theme-chalk’

}

]

]

import ‘element-plus/lib/theme-chalk/index.css’;

import ‘dayjs/locale/zh-cn’;

import locale from ‘element-plus/lib/locale’;

import lang from ‘element-plus/lib/locale/lang/zh-cn’;

import {

ElAside,

ElButton,

ElButtonGroup,

} from ‘element-plus’;

const components: any[] = [

ElAside,

ElButton,

ElButtonGroup,

];

const plugins:any[] = [

ElLoading,

ElMessage,

ElMessageBox,

ElNotification

];

const element = (app: any):any => {

// 国际化

locale.use(lang);

// 全局配置

app.config.globalProperties.$ELEMENT = { size: ‘small’ };

components.forEach(component => {

app.component(component.name, component);

});

plugins.forEach(plugin => {

app.use(plugin);

});

};

export default element;

// main.ts

import element from ‘./plugin/elemment’

const app = createApp(App);

element(app);

axios


axios的安装使用和vue2上没有什么大的区别,如果需要做一些扩展属性,还是需要声明一个新的类型。

type Config = AxiosRequestConfig & {successNotice? : boolean, errorNotice? : boolean}

import axios, { AxiosResponse, AxiosRequestConfig } from ‘axios’;

import { ElMessage } from ‘element-plus’;

const instance = axios.create({

baseURL: process.env.VUE_APP_API_BASE_URL || ‘’,

timeout: 120 * 1000,

withCredentials: true

});

// 错误处理

const err = (error) => {

if (error.message.includes(‘timeout’)) {

ElMessage({

message: ‘请求超时,请刷新网页重试’,

type: ‘error’

});

}

if (error.response) {

const data = error.response.data;

if (error.response.status === 403) {

ElMessage({

message: ‘Forbidden’,

type: ‘error’

});

}

if (error.response.status === 401) {

ElMessage({

message: ‘Unauthorized’,

type: ‘error’

});

}

}

return Promise.reject(error);

};

type Config = AxiosRequestConfig & {successNotice? : boolean, errorNotice? : boolean}

// 请求拦截

instance.interceptors.request.use((config: Config) => {

config.headers[‘Access-Token’] = localStorage.getItem(‘token’) || ‘’;

return config;

}, err);

// 响应拦截

instance.interceptors.response.use((response: AxiosResponse) => {

const config: Config = response.config;

const code = Number(response.data.status);

if (code === 200) {

if (config && config.successNotice) {

ElMessage({

message: response.data.msg,

type: ‘success’

});

}

return response.data;

} else {

let errCode = [402, 403];

if (errCode.includes(response.data.code)) {

ElMessage({

message: response.data.msg,

type: ‘warning’

});

}

}

}, err);

export default instance;

setup script


官方提供了一个实验性的写法,直接在script里面写setup的内容,即:setup script

之前我们写组件是这样的:

{{count}}

启用setup script后:在script上加上setup

{{count}}

是不是看起来简洁了很多,组件直接导入就行了,不用注册组件,数据定义了就可以用。其实我们可以简单的理解为script包括的内容就是setup中的,并做了return

导出方法

定义props

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车

前端视频资料:
,18年进入阿里一直到现在。**

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-DQnE6iLZ-1713346947056)]

[外链图片转存中…(img-uoWIsw4b-1713346947056)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

[外链图片转存中…(img-EyoIVc8z-1713346947057)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是附赠给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

详细大厂面试题答案、学习笔记、学习视频等资料领取,点击资料领取直通车

[外链图片转存中…(img-p5m9NTcf-1713346947057)]

前端视频资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值