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

文章介绍了在Vue应用中如何使用Vuex进行状态管理,创建命名空间模块(如Todo模块),以及如何结合ElementPlusUI库和axios进行API请求的定制。还涉及到了setupscript的使用和组件props的类型定义。
摘要由CSDN通过智能技术生成

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

使用props需要用到defineProps来定义,具体用法跟之前的props写法类似:

基础用法
构造函数进行检查 给props定义类型:

const props = defineProps({

gameId: Number,

userInfo: {

type: Object,

required: true

}

});

使用类型注解进行检查

defineProps<{

name: string

phoneNumber: number

userInfo: object

tags: string[]

}>()

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

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

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

img

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

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

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

最后

前15.PNG

前16.PNG

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处获取

ags: string[]

}>()

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

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

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

[外链图片转存中…(img-wWH23lF4-1713346914115)]

[外链图片转存中…(img-npMgpdHQ-1713346914116)]

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

[外链图片转存中…(img-EkYgG2Fi-1713346914116)]

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

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

最后

[外链图片转存中…(img-vLIVE2WG-1713346914117)]

[外链图片转存中…(img-YccYZ1Pd-1713346914117)]

由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的JavaScript面试题文档,或更多前端资料可以点此处获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值