Vue3+Vite+TS实现二次封装element-plus业务组件sfasga

下面是详细讲解 “Vue3 + Vite + TS 实现二次封装 element-plus 业务组件”的完整攻略。

一、前言

我们这里使用的框架是 Vue3,构建工具是 Vite,使用 TypeScript 对代码进行静态类型检查。我们将使用 element-plus 作为 UI 组件,同时对其进行二次封装。这样可以使我们的业务组件更加灵活、易用、容易扩展。

二、使用 Vite 创建项目

首先,我们需要使用 Vite 创建一个新项目:

# 全局安装 vite
npm install -g vite

# 使用 vite 创建新项目
vite create my-project --template vue-ts

这里我们使用了 --template vue-ts 选项来创建一个基于 Vue3 和 TypeScript 的项目。如果你已经有一个项目了,可以直接跳过此步骤。

三、安装 element-plus

接下来,我们安装 element-plus:

npm install element-plus --save

安装完成后,我们需要在 main.ts 中引入 element-plus:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/lib/theme-chalk/index.css'

import App from './App.vue'

createApp(App)
  .use(ElementPlus)
  .mount('#app')

四、封装 element-plus 组件

现在,我们开始对 element-plus 组件进行二次封装。这里我们以 Button 组件为例。

4.1 创建 Button 组件

我们在 components 目录下创建一个 Button 组件:

<!-- components/Button.vue -->
<template>
  <el-button v-bind="$attrs" v-on="$listeners">{{ $slots.default }}</el-button>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import 'element-plus/lib/theme-chalk/button.css'

export default defineComponent({
  name: 'MyButton',
  props: {
    type: String,
    icon: String,
    size: String,
    disabled: Boolean,
  },
})
</script>

注意,此处我们使用了 $attrs$listeners,这是为了保证我们的组件可以正确地传递 props 和事件。具体可以参考 Vue3 官方文档中的 透传属性

同时,我们将需要的 CSS 样式进行了引入。这样就可以直接使用这个组件了。

4.2 使用 Button 组件

我们在 App.vue 中使用这个组件:

<template>
  <my-button type="primary" icon="el-icon-search" size="medium" @click="handleClick">
    搜索
  </my-button>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import MyButton from './components/Button.vue'

export default defineComponent({
  name: 'App',
  components: {
    MyButton,
  },
  methods: {
    handleClick() {
      alert('Clicked!')
    },
  },
})
</script>

这样,我们就完成了对 Button 组件的二次封装。你可以根据需要,继续对其他组件进行封装。

五、示例说明

这里再给出两条示例说明。

5.1 封装 Select 组件并添加默认选项

我们可以在 Select.vue 中对 element-plus 的 Select 组件进行封装,并添加一个默认选项。

<!-- components/Select.vue -->
<template>
  <el-select v-bind="$attrs" v-on="$listeners">
    <el-option :value="defaultOption.value" :label="defaultOption.label" disabled />
    <slot />
  </el-select>
</template>

<script lang="ts">
import { defineComponent } from 'vue'
import 'element-plus/lib/theme-chalk/select.css'
import 'element-plus/lib/theme-chalk/option.css'

type Option = {
  value: string | number | undefined
  label: string | number | undefined
}

export default defineComponent({
  name: 'MySelect',
  props: {
    ...props,
    defaultOption: {
      type: Object as () => Option,
      default: () => ({ value: '', label: '请选择' }),
    },
  },
})
</script>

然后,在 App.vue 中使用这个组件,并添加一个默认选项:

<template>
  <my-select :options="options" v-model="selected">
    <el-option
      v-for="(option, index) in options"
      :key="index"
      :value="option.value"
      :label="option.label"
    />
  </my-select>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue'
import MySelect from './components/Select.vue'

export default defineComponent({
  name: 'App',
  components: {
    MySelect,
  },
  setup() {
    const selected = ref('')
    const options = ref([
      { value: '1', label: '选项1' },
      { value: '2', label: '选项2' },
      { value: '3', label: '选项3' },
    ])
    return { selected, options }
  },
})
</script>

5.2 封装 InputNumber 组件并添加单位

我们还可以在 InputNumber.vue 中对 element-plus 的 InputNumber 组件进行封装,并添加一个单位。

<!-- components/InputNumber.vue -->

<template>
  <div class="my-input-number">
    <el-input-number v-bind="$attrs" v-on="$listeners" :value="value" @change="handleChange" />
    <span class="unit">{{ unit }}</span>
  </div>
</template>

<script lang="ts">
import { defineComponent, watch } from 'vue'
import 'element-plus/lib/theme-chalk/input-number.css'

export default defineComponent({
  name: 'MyInputNumber',
  props: {
    ...props,
    unit: {
      type: String as () => string,
      default: '',
    },
    value: {
      type: Number as () => number,
      default: 0,
    },
  },
  mounted() {
    this.$refs.input.$el.setAttribute('inputmode', 'decimal')
  },
  methods: {
    handleChange(val: number) {
      this.$emit('update:value', val)
    },
  },
})
</script>

<style scoped>
.my-input-number.el-input-number__decrease,
.my-input-number.el-input-number__increase {
  margin-top: 0;
}

.my-input-number .unit {
  margin-left: 4px;
}
</style>

然后,在 App.vue 中使用这个组件,并添加一个单位:

<template>
  <my-input-number v-model="quantity" :unit="'件'" />
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue'
import MyInputNumber from './components/InputNumber.vue'

export default defineComponent({
  name: 'App',
  components: {
    MyInputNumber,
  },
  setup() {
    const quantity = ref(1)
    return { quantity }
  },
})
</script>

这样,我们就完成了对 InputNumber 组件的二次封装,并添加了一个单位。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue3+Vite+TS实现二次封装element-plus业务组件sfasga - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 详解VUE单页应用骨架屏方案

    标题:详解VUE单页应用骨架屏方案 什么是骨架屏 骨架屏即为页面骨架,通俗点来说就是一个页面还没加载完成时,所出现的一种页面展示方案。它将页面大致的结构和样式提前定义好,填充占位元素在视觉上证明了页面正在加载。而实际上用户看到的只是一个假象,等待页面正式加载完成后,占位元素会被替换成真实的内容。 骨架屏在VUE单页应用中的应用 在VUE单页应用中,页面通过异…

    Vue 2023年5月28日
    00
  • Vue.js中让人容易忽略的API详解

    Vue.js中让人容易忽略的API详解可以涉及很多方面,我就从以下几个方面进行详细讲解。 一、computed computed是Vue.js中的一个属性,它主要用来设置计算属性。和methods相比,computed具有缓存的作用,只有当该属性的依赖发生变化时才会重新计算值。computed属性的值是根据它所依赖的其他属性变化而变化的,这样就能很方便地实现…

    Vue 2023年5月28日
    00
  • vue中循环请求接口参数问题及解决

    下面是“vue中循环请求接口参数问题及解决”的完整攻略。 问题描述 在Vue中,我们有时需要使用循环来请求后端接口的数据。例如,我们可能需要在一个页面上显示多个商品的信息,每个商品的详细信息都需要通过调用接口来获取。这时候,我们会发现循环的次数和请求的参数之间存在一定的关系,如果我们直接在循环内部发送异步请求,可能会造成请求重复提交或者请求参数不正确的问题,…

    Vue 2023年5月27日
    00
  • vue日历组件的封装方法

    下面我会详细讲解“Vue日历组件的封装方法”的完整攻略。 1. 选择正确的依赖项 在Vue项目中,我们可以使用已有的第三方插件来创建日历组件,这些插件通常提供了日历的样式和功能。下面是几个值得推荐的Vue日历组件:- vue-fullcalendar- v-calendar- vue-simple-calendar 对于仅仅需要显示日历的场景,这些插件已经足…

    Vue 2023年5月29日
    00
  • vue3中reactive数据被重新赋值后无法双向绑定的解决

    在Vue3中,数据响应式的实现由Vue2中的Object.defineProperty改为了ES6的Proxy,使得Vue3的响应式系统在性能和功能上都有了提升。但是,在Vue3中,当我们直接给响应式对象中的属性进行重新赋值时,这个属性就会脱离响应式系统,从而失去了双向绑定的功能,即无法自动更新页面。下面给出两个示例,分别说明这个问题的存在及解决方式。 问题…

    Vue 2023年5月27日
    00
  • Vue.js最佳实践(五招助你成为vuejs大师)

    Vue.js最佳实践(五招助你成为vuejs大师)是一篇关于Vue.js开发实践的文章,其中详细讲述了Vue.js最佳的五项实践原则。下面我们将详细介绍这五项实践原则: 一、使用“单文件组件”和“组件懒加载”实现代码复用和性能优化 单文件组件(Single File Components,SFC)是Vue.js提倡的一种组件写法,它将一个组件的HTML、CS…

    Vue 2023年5月27日
    00
  • vue3.0 vue.config.js 配置基础的路径问题

    配置Vue.js项目的构建后的静态文件的发布路径是非常必要的。在Vue.js 3.0中,配置静态资源的发布路径的方式有所改变。本文将提供Vue.js 3.0中的vue.config.js配置多个基础路径的示例说明。 创建Vue.js 3.0项目 使用Vue CLI 3创建Vue.js 3.0项目: $ vue create my-project vue.co…

    Vue 2023年5月28日
    00
  • Vue自定义复制指令 v-copy功能的实现

    下面是“Vue自定义复制指令 v-copy功能的实现”的完整攻略: 什么是v-copy? v-copy是Vue自带的指令之一,用于将指定的值复制到剪切板中。使用v-copy可以使得复制的操作更加简单和便捷。但是,v-copy只能复制一个固定的值,如果我们想自定义复制内容,则需要自定义一个v-copy指令。 v-copy的功能实现 v-copy可以说是一个比较…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部