IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> vue3 项目 - 组件封装 - 图标选择器 -> 正文阅读

[JavaScript知识库]vue3 项目 - 组件封装 - 图标选择器

此为demo练习记录,个人思路二次整理,如有不当欢迎指正

一. 实现 图标选择器 组件封装的步骤简述

  1. 全局注册 element-plus 的icon组件
  2. 创建 ChooseIcon.vue 组件
    1. . 引入element-plus的 icons
    2. . 渲染 icon 组件
    3. . 实现 copy 方法

二 . 全局注册 element-plus 的icon组件

参考element-plus 官网:
https://element-plus.gitee.io/zh-CN/component/icon.html

  1. 在main.ts中 从"@element-plus/icons-vue" 中导入所有图标并进行全局注册
  2. 创建 utils/index.ts 文件 创建方法 (toLine) , 将icon组件转驼峰命名
// main.ts
// 引入icons
import * as Icons from "@element-plus/icons-vue";
// 全局注册icons组件
for (const [key, component] of Object.entries(Icons)) {
  app.component(`el-icon-${toLine(key)}`, component)
}

//  utils/index.ts
export const toLine = (v: string) => {
  return v.replace(/([a-z])([A-Z])/g, '$1-$2').toLocaleLowerCase();
};

```typescript

转换 结果 如下图所示 :

转换前:在这里插入图片描述
转换后:在这里插入图片描述
正则解读 :

([a-z])和([A-Z])正好匹配小写,大写字母;
g : 全局匹配
$1表示匹配的第一个小括号里的 ,$2是匹配的第2个小括号里的内容
见示例

let str = 'AaaBbCcDdEe'
//  $1 : 匹配 ([a-z])
//  $2 : 匹配 ([A-Z])
let test = str.replace(/([a-z])([A-Z])/g, '$1-$2')
console.log(test, 'test')  // Aaa-Bb-Cc-Dd-Ee test

三 . 创建 components/ChooseIcon.vue组件

目录结构 :
components

  • ChooseIcon
    • index.vue
    • components
      • CopyIcons.vue
  1. ChooseIcon/index.vue :
<template>
  <el-button :type="type" @click="handleClick">
    <slot>{{ buttonText }}</slot>
  </el-button>
  <copy-icons title="图标选择器" v-model:visible="visible" />
</template>

<script setup lang="ts">
import { defineProps, ref } from 'vue'
import copyIcons from './components/copyIcons.vue'

let props = defineProps({
  buttonText: {
    type: String,
    default: '',
  },
  type: {
    type: String,
    default: 'primary',
  },
})

let visible = ref<boolean>(false)

const handleClick = () => {
  visible.value = true
}
</script>
  1. ChooseIcon/components/CopyIcons.vue :
<template>
  <el-dialog draggable :model-value="visible" :title="title" width="42%" @close="handleClose">
    <el-scrollbar height="400px">
      <div class="icons-container">
        <div v-for="(v, i) in Object.keys(Icons)" :key="i" class="icon">
          <component :is="`el-icon-${toLine(v)}`"></component>
          <span class="icon-text"> {{ `el-icon-${toLine(v)}` }}</span>
        </div>
      </div>
    </el-scrollbar>
  </el-dialog>
</template>

<script setup lang="ts">
import { defineProps, defineEmits } from 'vue' // 引入icons
import * as Icons from '@element-plus/icons-vue'
import { toLine } from '@/utils'
let props = defineProps({
  title: {
    type: String,
    default: '选择图标',
  },
  visible: {
    type: Boolean,
    default: false,
  },
})
const emits = defineEmits(['update:visible'])
const handleClose = () => {
  emits('update:visible', false)
}
</script>

<style scoped lang="scss">
::v-deep .el-dialog__body {
  height: 400px !important;
  overflow-y: scroll;
}
.icons-container {
  display: flex;
  flex-wrap: wrap;
  .icon {
    width: 25%;
    height: 60px;
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 0 5px;
    box-sizing: border-box;
    cursor: pointer;
    .icon-text {
      flex: 1;
      font-size: 12px;
    }
    &:hover {
      color: #409efa;
    }
  }
  svg {
    width: 1.5em;
    height: 1.5em;
  }
}
</style>

四.实现 copy 方法

  1. hooks/index.ts
import { ElMessage } from 'element-plus'
export const copy = (text: string, tips: string) => {
  // 创建 input 标签
  let input = document.createElement('input')
  // 设置 input 标签的值
  input.value = text
  // 添加标签
  document.body.appendChild(input)
  // 选中值
  input.select()
  // 复制
  document.execCommand('copy')
  // 复制成功提示消息
  ElMessage.success(tips)

  // 移除标签
  document.body.removeChild(input)
}
  1. 完善 CopyIcons组件代码
<template>
  <el-dialog draggable :model-value="visible" :title="title" width="42%" @close="handleClose">
    <el-scrollbar height="400px">
      <div class="icons-container">
        <div v-for="(v, i) in Object.keys(Icons)" :key="i" class="icon" @click="copyIcon(v)">
          <component :is="`el-icon-${toLine(v)}`"></component>
          <span class="icon-text"> {{ `el-icon-${toLine(v)}` }}</span>
        </div>
      </div>
    </el-scrollbar>
  </el-dialog>
</template>

<script setup lang="ts">
import { copy } from '@/hooks'
const copyIcon = (v: string) => {
  const tagName = `<el-icon-${toLine(v)} />`
  copy(tagName, '标签复制成功')
  // 复制完成 关闭弹窗
  handleClose()
}
</script>
  1. 单页面内使用
<template>
  <div>
    <choose-icon buttonText="选择图标" />
  </div>
</template>

<script setup lang="ts">
import ChooseIcon from '@/components/ChooseIcon/index.vue'
</script>

五. 效果展示

在这里插入图片描述

六. 总结

提示:以上为 vue3 封装 图标选择器功能实现完整记录 ,如有不当以及不清晰之处欢迎评论区交流;

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-04 01:02:48  更:2022-09-04 01:05:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:46:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码