uniapp自己封装一个select组件

文章介绍了作者在Uniapp中遇到uni-combox和uni-data-select组件不满足需求的情况,于是自己封装了一个Vue3+TS+Vite的select组件,包括模板、脚本和样式,以及使用方法和注意事项。
摘要由CSDN通过智能技术生成

uniapp自己封装一个select组件

我在uniapp找了很久的select组件,发现可选的uni-combox组件和uni-data-select组件都不符合我的需求,uni-combox不能使用对象数组,而uni-data-select不能输入搜索。所以我自己封装了一个小组件(这里我项目用的vue3+ts+vite+uniapp),大家可以拿在这里插入代码片去直接用或者更加完善,话不多说,直接上代码:

<template>
    <view class="select">
        <uni-easyinput 
            v-model="selectValue"
            :placeholder="placeholder" 
            @blur="blur" 
            @change="change" 
            @focus="focus"
            @input="input"
            >
        </uni-easyinput>
        <scroll-view scroll-y class="item-box" v-show="isShow">
            <view v-if="selectOptionList.length === 0" class="item">暂无数据</view>
            <view v-for="item,index in selectOptionList" class="item" hover-class="item-hover" @click="changeValue(item)">{{ item[labelKey] }}</view>
        </scroll-view>
    </view>
</template>

<script lang="ts" setup>
import {isShallow, ref} from 'vue'
import { onShow } from '@dcloudio/uni-app';

const selectValue = ref('')//选择的值
const isShow = ref(false)//是否显示

const props = defineProps({
    labelKey:{type:String,default:'label'},//自定义label值
    valueKey:{type:String,default:'value'},//自定义value值
    optionList:{type:Array,default:[]},//可选值数组
    placeholder:{type:String,default:'请选择'}//提示语
})

const Emit = defineEmits(["selectItem"])

const selectOptionList = ref([])

onShow(()=>{
    selectOptionList.value = props.optionList
})

const focus = ()=>{
    isShow.value = true
}

const blur = ()=>{
    setTimeout(() => {
        isShow.value = false
    });
}

const change = ()=>{

}

const changeValue = (item)=>{
    selectValue.value = item[props.labelKey]
    Emit("selectItem",item)
}

const input = (e)=>{
    if(e){
        selectOptionList.value = props.optionList.filter(item=> item[props.labelKey].indexOf(e) > -1);
        return
    }
    selectOptionList.value = props.optionList
}


</script>

<style lang="scss" scoped>
.select{
    position: relative;
    width: 100%;
    height: 40px;
    .item-box{
        position: absolute;
        width: 100%;
        display:flex;
        flex-direction:column;
        max-height: 150px;
        border-radius:4px;
        box-shadow:0 4px 10px 0 #D5D5D5;
        z-index:999;
        background:#ffffff;
        .item{
            font-size:14px;
            height:36px;
            display:flex;
            align-items:center;
            text-indent: 10px;
        }
        .item-hover{
            background:#F6F8FB;
        }
    }
}
</style>

使用方式:(外层的view需要设置宽度,否则就是当前盒子的100%宽度),如果你的对象属性值不是value和label的话可以根据你的需求进行更改。

<view class="task">
    <Select @selectItem="selectItem" placeholder="请选择考核任务" :optionList="taskList" valueKey="value" labelKey="label"/>
</view>
const taskList = ref([{value:1,label:'哈哈哈'},{value:2,label:'嘿嘿嘿'}])
const selectItem = (data)=>{
    console.log(data);
}

一个小组件还需要完善,我先发篇博客记录一下。

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Uniapp 中自己封装一个表单组件,可以按照以下步骤进行操作: 1. 创建一个新的组件文件,例如 `MyForm.vue`。 2. 在 `MyForm.vue` 文件中,编写表单组件的模板结构和样式,可以使用 `<template>` 和 `<style>` 标签。 3. 在 `<template>` 标签中,定义表单的各个字段,例如输入框、选择器、按钮等。你可以使用 v-model 指令来实现数据的双向绑定。 4. 在 `<script>` 标签中,导出组件并定义组件的属性和方法。你可以使用 props 属性来接收外部传入的数据,并在组件内部使用。 5. 在 `methods` 部分,编写处理表单提交的方法。可以使用 `@click` 事件监听器来调用该方法。 6. 在需要使用表单的页面中,引入并使用自己封装的表单组件。 以下是一个简单的示例代码: ```vue // MyForm.vue <template> <form> <input v-model="name" type="text" placeholder="Name"> <input v-model="email" type="email" placeholder="Email"> <button @click="submitForm">Submit</button> </form> </template> <script> export default { data() { return { name: '', email: '' }; }, methods: { submitForm() { // 处理表单提交逻辑,可以使用 this.name 和 this.email 获取表单数据 console.log('Name:', this.name); console.log('Email:', this.email); } } }; </script> <style scoped> /* 样式 */ </style> ``` 在页面中使用该组件: ```vue // MyPage.vue <template> <div> <h1>My Page</h1> <my-form></my-form> </div> </template> <script> import MyForm from '@/components/MyForm.vue'; export default { components: { MyForm } }; </script> <style scoped> /* 样式 */ </style> ``` 在上面的示例中,`MyForm.vue` 是自己封装的表单组件,`MyPage.vue` 是使用该组件的页面。你可以根据自己的需求修改和扩展这些示例代码。 希望这能帮到你!如有任何问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值