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

yizhihongxing

下面是详细讲解 “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的第一个commit分析

    下面我来详细讲解”浅谈vue的第一个commit分析”的完整攻略。 1. 了解Vue.js的号召与目标 Vue.js起源于2013年,是由一名华人开发者尤雨溪(Evan You)所创建的。他旨在创造一款简单、灵活的 JavaScript 框架用于构建用户界面。Vue.js也称为渐进式JavaScript框架,具有轻量级、易上手、高效渲染等特点。Vue.js近…

    Vue 2023年5月27日
    00
  • 利用Vue v-model实现一个自定义的表单组件

    实现一个自定义的表单组件,我们通常需要用到Vue.js中的组件。这个组件将包含一些输入元素,例如输入框、下拉框、单选框、复选框等等。这些元素需要收集数据并传递给父组件,以便在父组件中进行处理。 为了实现这个功能,我们可以利用Vue.js提供的v-model指令。v-model指令是一个双向数据绑定指令,它将数据绑定到表单元素的value属性上。当用户在输入框…

    Vue 2023年5月28日
    00
  • vue-resourse将json数据输出实例

    下面是详细讲解“vue-resource将json数据输出实例”的完整攻略: 1. 什么是vue-resource vue-resource是Vue.js官方提供的一个通信插件,它支持浏览器内置的XMLHttpRequest和JSONP,可以很方便地发起http请求并处理响应。 2. 安装vue-resource 可以使用npm命令安装vue-resourc…

    Vue 2023年5月28日
    00
  • Vue中this.$nextTick()的理解与使用方法

    理解this.$nextTick()方法 在Vue中,数据绑定是异步执行的,这意味着当我们改变了数据,没有立即反应到页面上。Vue的响应式系统会在下一次事件循环(Event Loop)中重新计算 DOM,并更新 DOM,这样可以保证性能。为了确保在DOM更新后再执行回调函数,可以使用Vue提供的方法:this.$nextTick()。 this.$nextT…

    Vue 2023年5月29日
    00
  • 详解在Vue.js编写更好的v-for循环的6种技巧

    当使用Vue.js编写v-for循环时,我们经常会遇到一些常见的问题,例如渲染列表不够高效、循环嵌套过多等。为了优化循环的性能并提高代码的质量,我们可以采用以下6种技巧。 技巧一:key属性的使用 在使用v-for循环渲染列表时,一定要为循环中的元素添加key属性。这样做的好处是告诉Vue.js循环中的每一个元素都是唯一的。使用key属性可以提高渲染的性能,…

    Vue 2023年5月29日
    00
  • Vue自定义指令介绍(2)

    下面为你详细讲解Vue自定义指令介绍(2)的完整攻略。 什么是自定义指令 自定义指令是 Vue 框架中的一种扩展,允许开发者在模板中以 v-xxx 的格式自定义指令,指令的定义和实现可以是全局的或局部的,并且可以带有参数和修饰符。 自定义指令主要有两种用途: 增强已有的 DOM 元素; 提供组件的行为和样式。 自定义指令的定义 自定义指令的定义通过 Vue.…

    Vue 2023年5月27日
    00
  • Vue的属性、方法、生命周期实例代码详解

    Vue是一种流行的JavaScript框架,在前端开发中被广泛使用。在Vue的学习过程中,理解Vue的属性、方法以及生命周期是非常重要的。下面是Vue的属性、方法以及生命周期的详细讲解。 属性 el el属性是Vue实例挂载的元素。可以是CSS选择器、HTML元素或DOM对象。 <div id="app"></div&g…

    Vue 2023年5月27日
    00
  • Vue3中echarts无法缩放的问题及解决方案

    首先我们需要知道的是,Vue3中使用echarts存在一个无法缩放的问题。这是因为Vue3在新版中将zoom插件从vue-echarts移除了,所以默认情况下是无法使用缩放功能的。 不过,我们可以通过以下步骤解决这个问题: 步骤一:安装vue-echarts和echarts 在Vue3项目中,我们需要先安装vue-echarts和echarts两个依赖。 n…

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