• Vue将Element Plus 进行自定义封装


    一、前言

    Element Plus 是一套基于 Vue 3.0 的桌面端组件库,它可以很方便地实现各种样式的组件,就连图标选择器这样的小功能也不在话下。不过今天我们要做的是——封装 Element Plus 的图标选择器。

    二、安装

    安装 Element Plus:

    npm i element-plus -S

    三、预览

    先看一下我们要实现的效果:

    https://cdn.jsdelivr.net/gh/xugaoyi/image_store/blog/20210823232623.gif

    四、封装

    首先我们需要在 `main.js` 中引入 `Element Plus`:

    1. import { createApp } from 'vue'
    2. import ElementPlus from 'element-plus'
    3. import 'element-plus/dist/index.css'
    4. createApp(App).use(ElementPlus).mount('#app')

    然后我们要封装一个图标选择器组件,这里我们命名为 `IconPicker`,并将其注册为全局组件:

    1. import { Upload, Dialog, RadioGroup, RadioButton, Input, Button } from 'element-plus'
    2. import { computed, defineComponent, ref, watch } from 'vue'
    3. export default defineComponent({
    4.   name: 'IconPicker',
    5.   components: {
    6.     ElUpload: Upload,
    7.     ElDialog: Dialog,
    8.     ElRadioGroup: RadioGroup,
    9.     ElRadioButton: RadioButton,
    10.     ElInput: Input,
    11.     ElButton: Button
    12.   },
    13.   props: {
    14.     value: {
    15.       type: String,
    16.       required: true
    17.     },
    18.     prefixIcon: {
    19.       type: String,
    20.       default: 'el-icon-more'
    21.     }
    22.   },
    23.   emits: ['update:value'],
    24.   setup(props, { emit }) {
    25.     const showIconPicker = ref(false) // 是否显示图标选择器
    26.     const searchText = ref('') // 搜索文本框的值
    27.     const searchResults = ref([]) // 搜索结果
    28.     // 所有图标名称列表
    29.     const icons = [
    30.       'el-icon-info',
    31.       'el-icon-warning',
    32.     // ...
    33.       'el-icon-close'
    34.     ]
    35.     // 根据搜索文本过滤图标名称
    36.     const filteredIcons = computed(() => {
    37.       return icons.filter(icon => icon.includes(searchText.value))
    38.     })
    39.     // 根据搜索文本过滤图标分类
    40.     const iconCategories = computed(() => {
    41.       const categories = []
    42.       for (let i = 0; i < filteredIcons.value.length; i++) {
    43.         const icon = filteredIcons.value[i]
    44.         const category = icon.split('-')[0]
    45.         if (!categories.includes(category)) {
    46.           categories.push(category)
    47.         }
    48.       }
    49.       return categories
    50.     })
    51.     // 根据当前搜索结果生成分类列表
    52.     const categoryList = computed(() => {
    53.       const list = []
    54.       for (let i = 0; i < iconCategories.value.length; i++) {
    55.         const category = iconCategories.value[i]
    56.         const icons = filteredIcons.value.filter(icon => icon.split('-')[0] === category)
    57.         list.push({
    58.           name: category,
    59.           icons
    60.         })
    61.       }
    62.       return list
    63.     })
    64.     // 当搜索文本发生变化时重新过滤图标
    65.     watch(searchText, () => {
    66.       searchResults.value = filteredIcons.value
    67.     })
    68.     // 打开图标选择器
    69.     const openIconPicker = () => {
    70.       showIconPicker.value = true
    71.     }
    72.     // 关闭图标选择器
    73.     const closeIconPicker = () => {
    74.       showIconPicker.value = false
    75.     }
    76.     // 选择一个图标
    77.     const selectIcon = (icon) => {
    78.       emit('update:value', icon)
    79.       closeIconPicker()
    80.     }
    81.     return {
    82.       showIconPicker,
    83.       searchText,
    84.       searchResults,
    85.       categoryList,
    86.       openIconPicker,
    87.       closeIconPicker,
    88.       selectIcon
    89.     }
    90.   }
    91. })

    五、使用

    在需要使用图标选择器的地方,我们只需要通过 `v-model` 绑定一个变量即可:

    1. <template>
    2.   <div>
    3.     <el-input v-model="icon" readonly />
    4.     <el-button type="primary" @click="openIconPicker">选择图标el-button>
    5.     <icon-picker v-model="icon" />
    6.   div>
    7. template>
    8. <script>
    9. import IconPicker from './components/IconPicker.vue'
    10. import { defineComponent, ref } from 'vue'
    11. export default defineComponent({
    12.   name: 'App',
    13.   components: {
    14.     IconPicker
    15.   },
    16.   setup() {
    17.     const icon = ref('el-icon-info')
    18.     return {
    19.       icon
    20.     }
    21.   }
    22. })
    23. script>

    最后我们只需要在 `main.js` 中引入我们封装的 `IconPicker` 组件:

    1. import { createApp } from 'vue'
    2. import ElementPlus from 'element-plus'
    3. import 'element-plus/dist/index.css'
    4. import App from './App.vue'
    5. import IconPicker from './components/IconPicker.vue'
    6. const app = createApp(App)
    7. app.use(ElementPlus)
    8. app.component('IconPicker', IconPicker)
    9. app.mount('#app')

    六、总结

    至此,我们已经完成了一个图标选择器的封装工作。封装这个小组件的意义不在于实现这个功能,更在于让我们了解如何封装一个 Vue 组件。在开发中,不管是做大型应用还是小型应用,都离不开组件的使用和封装,应该都能收到很好的效果。

  • 相关阅读:
    探测SiTime硅晶振输出的实用指南
    JavaScript 实现每次循环都等待
    关于用css设置input输入框hover的时候的样式以及当input为disabled的时候,不要让hover样式生效
    Nue JS 造全新的 Web 生态
    Spring Cloud Gateway:打造可扩展的微服务网关
    关于这半年,我在干些什么,有一些想和你分享的话题
    Linux - 虚拟机的三种网络模式
    趋势分析 | 如何选择适合超融合的备份方案?
    保证金服务数据一致性问题-大数据解决方案
    SqlExceptionHelper 142: ORA-00909: 参数个数无效
  • 原文地址:https://blog.csdn.net/m0_72196169/article/details/134068361