1.element-plus组件api挂载到app

添加文件 src/plugins/element.ts

src/plugins/element.ts 代码内容:

  1. import { App } from 'vue'
  2. import {
  3. ElButton,
  4. ElMessage,
  5. ElNotification,
  6. ElMessageBox
  7. } from 'element-plus'
  8. import ElementPlus from 'element-plus'
  9. import 'element-plus/dist/index.css'
  10. // Element Plus 组件内部默认使用英语
  11. // https://element-plus.gitee.io/zh-CN/guide/i18n.html
  12. import zhCn from 'element-plus/es/locale/lang/zh-cn'
  13. // Element Plus 直接使用了 Day.js 项目的时间日期国际化设置, 并且会自动全局设置已经导入的 Day.js 国际化配置。
  14. import 'dayjs/locale/zh-cn'
  15. // $ELEMENT size属性类型
  16. export type Size = 'default' | 'medium' | 'small' | 'mini'
  17. export default (app: App): void => {
  18. app.use(ElementPlus, {
  19. locale: zhCn
  20. })
  21. // 按需导入组件列表
  22. const components = [
  23. ElButton,
  24. ElMessage,
  25. ElNotification,
  26. ElMessageBox
  27. ]
  28. components.forEach(component => {
  29. app.use(component)
  30. })
  31. // Vue.prototype 替换为 config.globalProperties
  32. // 文档说明 https://v3.cn.vuejs.org/guide/migration/global-api.html#vue-prototype-%E6%9B%BF%E6%8D%A2%E4%B8%BA-config-globalproperties
  33. app.config.globalProperties.$message = ElMessage
  34. app.config.globalProperties.$notify = ElNotification
  35. app.config.globalProperties.$confirm = ElMessageBox.confirm
  36. app.config.globalProperties.$alert = ElMessageBox.alert
  37. app.config.globalProperties.$prompt = ElMessageBox.prompt
  38. // element-plus全局配置
  39. // 说明文档:https://element-plus.gitee.io/#/zh-CN/component/quickstart#quan-ju-pei-zhi
  40. // 该对象目前支持 size 与 zIndex 字段。size 用于改变组件的默认尺寸 small,zIndex 设置弹框的初始 z-index(默认值:2000)。
  41. app.config.globalProperties.$ELEMENT = {
  42. size: 'medium',
  43. // zIndex: 2000 弹框zIndex默认值:2000
  44. }
  45. }

安装dayjs npm install dayjs

2.类型声明问题

src/main.ts

  1. import { createApp } from 'vue'
  2. import router from './router/index';
  3. import store from './store'
  4. import App from './App.vue'
  5. import 'normalize.css/normalize.css'
  6. import '@/styles/index.scss'
  7. import 'virtual:svg-icons-register'
  8. import initSvgIcon from '@/icons/index'
  9. // element-plus
  10. import installElementPlus from './plugins/element'
  11. createApp(App)
  12. .use(store)
  13. .use(installElementPlus)
  14. .use(initSvgIcon)
  15. .use(router)
  16. .mount('#app')

安装@vue/runtime-core

  1. npm install @vue/runtime-core

创建自定义声明文件 src/runtime.d.ts
image.png

  1. // 挂载到vue实例上
  2. import { ElMessageBox, ElMessage, ElNotification } from 'element-plus'
  3. import { Size } from './plugins/element'
  4. // vue实例上挂载属性类型声明
  5. declare module '@vue/runtime-core' {
  6. interface ComponentCustomProperties {
  7. $message: typeof ElMessage;
  8. $notify: typeof ElNotification;
  9. $confirm: typeof ElMessageBox.confirm;
  10. $alert: typeof ElMessageBox.alert;
  11. $prompt: typeof ElMessageBox.prompt;
  12. $ELEMENT: {
  13. size:Size
  14. }
  15. }
  16. }

自定义类型声明不能放在env.d.ts里,会导致.vue文件不能识别。

3.组件中使用

src/views/dashborad/index.vue
image.png
当敲写proxy.$时 挂载类型成功提示出来了
image.png

  1. <template>
  2. <div>
  3. <h1>Dashboard page</h1>
  4. <svg-icon icon-class="bug"></svg-icon>
  5. <!-- icon-class svg图标名称 class-name 额外的自定义类名 @click绑定事件 -->
  6. <svg-icon icon-class="404" class-name="custom-class" @click="sayHi"></svg-icon>
  7. </div>
  8. </template>
  9. <script setup lang="ts">
  10. import { getCurrentInstance } from 'vue'
  11. const { proxy } = getCurrentInstance()!
  12. const sayHi = () => {
  13. proxy?.$message.success('恭喜你,这是一条成功消息')
  14. }
  15. </script>
  16. <style lang="scss">
  17. .custom-class { // 自定义样式404
  18. font-size: 200px;
  19. color: green;
  20. }
  21. </style>

点击404图标 效果图
image.png

eslintrc.js

rules关闭了一条规则

  1. {
  2. "rules": {
  3. "no-unused-expressions": "off"
  4. }
  5. }

本节源码参考

https://gitee.com/zhufengpeixun/vue3-admin2

对于每节文章有问题需要补充评论的 大家可以写在每节下方评论处 感谢