当前位置:   article > 正文

Vue3 Element Plus 封装 el-select - 附完整示例_elementplus el-select

elementplus el-select

Element Plus

基于 Vue 3,面向设计师和开发者的组件库

目录

Element Plus

效果

一、介绍

 1、官方文档

2、官方示例

二、准备工作

1、安装依赖包

 2、示例版本 

三、使用步骤

1、element-plus自动导入

Vite

1、绑定值

2、远程搜索

3、change事件,子组件传值给父组件,更新值

四、完整示例

目录结构

Index.vue

Example.vue

  欢迎扫描下方二维码关注VX公众号


效果

一、介绍

 1、官方文档

一个 Vue 3 UI 框架 | Element Plus

一个 Vue 3 UI 框架 | Element PlusA Vue 3 based component library for designers and developersicon-default.png?t=N7T8https://element-plus.org/zh-CN/

2、官方示例

二、准备工作

1、安装依赖包

  1. # NPM
  2. $ npm install element-plus --save
  3. # Yarn
  4. $ yarn add element-plus
  5. # pnpm
  6. $ pnpm install element-plus

 2、示例版本 

"element-plus": "^2.4.4",

三、使用步骤

1、element-plus自动导入

首先你需要安装unplugin-vue-components 和 unplugin-auto-import这两款插件

npm install -D unplugin-vue-components unplugin-auto-import

然后把下列代码插入到你的 Vite 或 Webpack 的配置文件中

Vite
  1. // vite.config.ts
  2. import { defineConfig } from 'vite'
  3. import AutoImport from 'unplugin-auto-import/vite'
  4. import Components from 'unplugin-vue-components/vite'
  5. import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
  6. export default defineConfig({
  7. // ...
  8. plugins: [
  9. // ...
  10. AutoImport({
  11. resolvers: [ElementPlusResolver()],
  12. }),
  13. Components({
  14. resolvers: [ElementPlusResolver()],
  15. }),
  16. ],
  17. })

注:完整引入 / 按需导入 / 手动导入等方式请参照下方链接配置

快速开始 | Element Plus

1、绑定值

父组件:      v-model:vModel="value"

子组件:      v-model="vModel"

注:这里的父组件务必在v-model后面加上:vModel,选中值时用于更新值

2、远程搜索

输入关键字以从远程服务器中查找数据。

从服务器搜索数据,输入关键字进行查找。为了启用远程搜索,需要将filterableremote设置为true,同时传入一个remote-method。 remote-method为一个Function,它会在输入值发生变化时调用,参数为当前输入值。 需要注意的是,如果 el-option 是通过 v-for 指令渲染出来的,此时需要为 el-option 添加 key 属性, 且其值需具有唯一性,比如这个例子中的 item.id具体示例在文末的完整示例部分展示。

3、change事件,子组件传值给父组件,更新值

选中值发生变化时触发。

将选中值的lable显示在数据框,在本示例中用的name,可根据实际情况做调整。具体示例在文末的完整示例部分展示。

emit('update:vModel', val);

注:这里务必保证与父组件的绑定值(v-model:vModel="value")是相一致的,用于子组件向父组件传值更新值

四、完整示例

目录结构

src

--components

----select

------Index.vue

--views

----Example.vue

Index.vue

  1. <template>
  2. <el-select
  3. v-model="vModel"
  4. filterable
  5. remote
  6. reserve-keyword
  7. :placeholder="props.placeholder"
  8. remote-show-suffix
  9. :remote-method="remoteMethod"
  10. @change="handleChange"
  11. >
  12. <el-option v-for="item in props.options" :key="item.id" :label="item.name" :value="item.id" />
  13. </el-select>
  14. </template>
  15. <script setup lang="ts" name="selectSearch">
  16. import { ref, defineProps, watch, defineExpose } from 'vue';
  17. const props = defineProps({
  18. vModel: {
  19. type: String,
  20. default: () => '',
  21. require: true,
  22. },
  23. placeholder: {
  24. type: String,
  25. default: () => '',
  26. require: true,
  27. },
  28. options: {
  29. type: Array,
  30. default: () => [],
  31. required: true,
  32. },
  33. });
  34. const vModel = ref('');
  35. watch(
  36. () => props.options,
  37. (newValue, oldValue) => {},
  38. { immediate: true, deep: true }
  39. );
  40. watch(
  41. () => props.vModel,
  42. (newValue, oldValue) => {
  43. vModel.value = props.vModel;
  44. },
  45. { immediate: true, deep: true }
  46. );
  47. // 定义子组件向父组件传值/事件
  48. const emit = defineEmits(['update:vModel', 'remote-method']);
  49. const remoteMethod = (query?: string) => {
  50. emit('remote-method', query);
  51. };
  52. const handleChange = (val: string) => {
  53. emit('update:vModel', val);
  54. };
  55. </script>

Example.vue

  1. <template>
  2. <div>
  3. <SelectSearch
  4. ref="selectSearch"
  5. v-model:vModel="value"
  6. :placeholder="placeholder"
  7. :options="data"
  8. @remote-method="remoteMethod"
  9. @update:vModel="handleUpDate"
  10. />
  11. </div>
  12. </template>
  13. <script setup lang="ts" name="example">
  14. import { ref, defineAsyncComponent, onMounted } from 'vue';
  15. // 引入组件
  16. const SelectSearch = defineAsyncComponent(() => import('../components/select/Index.vue'));
  17. // 定义变量
  18. const value = ref('');
  19. const data = ref([]) as any;
  20. const placeholder = ref('请选择');
  21. onMounted(() => {
  22. // 真实项目是根据请求接口获取数据
  23. data.value = [
  24. {
  25. id: '111',
  26. name: '数据A'
  27. },
  28. {
  29. id: '555',
  30. name: '数据D'
  31. },
  32. {
  33. id: '666',
  34. name: '数据F'
  35. }
  36. ]
  37. })
  38. // 可搜索下拉框
  39. const remoteMethod = (query: string) => {
  40. // 真实项目是根据query参数请求接口获取数据
  41. data.value = [
  42. {
  43. id: '111',
  44. name: '数据A'
  45. },
  46. {
  47. id: '222',
  48. name: '数据B'
  49. },
  50. {
  51. id: '333',
  52. name: '数据C'
  53. }
  54. ]
  55. };
  56. const handleUpDate = (v: any) => {
  57. data.value.map((item: { id: any; name: any }) => {
  58. if (item.id === v) value.value = item.name;
  59. });
  60. value.value = v;
  61. };
  62. </script>

  欢迎扫描下方二维码关注VX公众号

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/890794
推荐阅读
相关标签
  

闽ICP备14008679号