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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)
最后
由于文档内容过多,为了避免影响到大家的阅读体验,在此只以截图展示部分内容,详细完整版的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面试题文档,或更多前端资料可以点此处获取。