uni-app的下拉搜索选择组合框

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家介绍uni-app中一款可以搜索下拉选择输入框的插件

下拉搜索选择组合框

superwei-combox 组合框

uni-app中可下拉搜索选择框uni-combox组件

插件地址

superwei-combox 组合框 - DCloud 插件市场

下载插件包导入HBuilderX

下拉选择效果

输入数据效果

需要输入数据时需要启用是否允许用户创建新条目(isAllowCreate=true),开启之后可以让用户输入搜索内容或者创建新内容进行提交,返回后重新渲染可继续进行下拉选择

两种数据模式
JSON数据格式

非JSON数据格式

属性
属性名类型默认值说明
labelString-标签文字
valueString-combox的值
labelWidthStringauto标签宽度,有单位字符串,如:'100px'
placeholderString-输入框占位符
candidatesArray/String[]候选字段
emptyTipsString无匹配项无匹配项时的提示语
selectedBackgroundString#f5f7fa选中项背景颜色
selectedColorString#409eff选中项文字颜色
isJSONBooleanfalse候选字段是否是json数组
keyNameString-json数组显示的字段值
disabledColorString#ababac禁用项文字颜色
isAllowCreateBooleantrue是否允许用户创建新条目
事件
事件称名说明返回值
@inputcombox输入事件返回combox输入值
@selectcombox选择事件返回combox选项值

案例实现

当我们需要获取到输入的数据和用户下拉选择的数据时,我们可以根据它的这两个@input事件和@select事件来实现,那么当你获取到后端数据并且需要提交数据传给后端时,可以定义一个变量inputMethod来区分用户输入还是下拉

实现效果

当我们选择输入或者下拉数据后,点击提交数据传给后端

用户选择下拉
非JSON数据格式

JSON数据格式

用户输入数据
非JSON数据格式

JSON数据格式

这样一来,我们依据一个变量就可以来判断用户选择下拉数据还是自己创建内容输入新数据来进行提交,搜索功能也是相同逻辑

实现代码

<template>
    <view class="content" style="margin: 300px auto;">
       <span class="title">非JSON数组模式</span>
       <superwei-combox :candidates="candidates" placeholder="请选择或输入" v-model="inputValue" @input="input"
            @select="select"></superwei-combox>
       <span class="title">JSON数组模式</span>
        <superwei-combox style="width:300px" :candidates="candidates_json" :isJSON="true" keyName="name" placeholder="请选择或输入"
            v-model="inputValue_json" @input="input_json" @select="select_json"></superwei-combox>
            <button type="primary" @click="toSubmit">提交</button>
    </view>
</template>
<script>
    export default {
        data() {
            return {    
                selectValue:'',//用户输入或者下拉的数据值value
                 inputMethod: '',  // 标志位,用于区分输入和下拉选择
                inputValue: '',//非json格式
                candidates: ['选项一', '选项二', '选项三', '选项四', '选项五', '选项六', '...'],
                inputValue_json: '',
                candidates_json: [{
                    id: '1',
                    name: '选项一'
                }, {
                    id: '2',
                    name: '选项二',
                    disabled: true // 单独设置disabled后即可禁用该选项
                }, {
                    id: '3',
                    name: '选项三'
                }, {
                    id: '4',
                    name: '选项四'
                }, {
                    id: '5',
                    name: '选项五',
                    disabled: true // 单独设置disabled后即可禁用该选项
                }, {
                    id: '6',
                    name: '...'
                }]
            }
        },
​
        methods: {
            toSubmit(){
                if(this.inputMethod==='input'){
                    console.log('用户选择了输入数据',this.selectValue)
                }else if(this.inputMethod==='select'){
                    console.log('用户选择了下拉框数据',this.selectValue)
                }
            },
            //非json格式数据-start
            input(e) {
                this.inputMethod = 'input'//标志位为用户输入
                this.selectValue = e
            },
            select(e) {
                this.inputMethod = 'select'//标志位为用户下拉
                this.selectValue = e
            },
            //非json格式数据-end
            /*上半段为非json数据格式,下半段为json数据格式*/
            //json格式数据-end
            input_json(e) {
                this.inputMethod = 'input'//标志位为用户输入
                this.selectValue = e
            },
            select_json(e) {
                this.inputMethod = 'select'//标志位为用户下拉
                this.selectValue = e.name
            }
            //json格式数据-end
        }
    }
</script>
​
<style>
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }
​
    .title {
        margin-top: 20px;
    }
</style>

好的,以下是一份使用 Vue3 和 uni-app 的示例代码,可以实现点击下拉选择框后弹出一个二级标题选择框,选择完毕后自动收起该选择框: ```vue <template> <div class="container"> <div class="select-box" @click="showSelect = !showSelect"> <div class="selected">{{ selected }}</div> <div class="arrow" :class="{ 'rotate': showSelect }"></div> </div> <div class="mask" v-show="showSelect" @click="showSelect = false"></div> <div class="select-popup" v-show="showSelect"> <div class="title">{{ title }}</div> <div class="list"> <div class="item" v-for="(item, index) in list" :key="index" @click="handleItemClick(index)">{{ item }}</div> </div> </div> </div> </template> <script> import { ref } from 'vue'; export default { setup() { const showSelect = ref(false); // 是否显示下拉选择框 const selected = ref(''); // 当前选中的选项 const title = ref('请选择一项'); // 选择框标题 const list = ref(['选项一', '选项二', '选项三']); // 选择框选项列表 // 处理选项点击事件 const handleItemClick = (index) => { selected.value = list.value[index]; // 更新当前选中的选项 title.value = selected.value; // 更新选择框标题 showSelect.value = false; // 收起选择框 }; return { showSelect, selected, title, list, handleItemClick, }; }, }; </script> <style scoped> .container { position: relative; } .select-box { display: flex; align-items: center; justify-content: space-between; padding: 10px; border: 1px solid #ccc; border-radius: 4px; cursor: pointer; } .arrow { width: 0; height: 0; border-style: solid; border-width: 5px 4px 0 4px; border-color: #666 transparent transparent transparent; margin-left: 10px; } .rotate { transform: rotate(180deg); } .mask { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); z-index: 1; } .select-popup { position: absolute; top: 100%; left: 0; width: 100%; max-height: 300px; overflow-y: auto; background-color: #fff; border: 1px solid #ccc; border-radius: 4px; z-index: 2; transition: all 0.3s ease; } .title { padding: 10px; font-weight: bold; border-bottom: 1px solid #ccc; } .list { display: flex; flex-wrap: wrap; padding: 10px; } .item { flex-basis: calc(33.33% - 10px); margin-right: 10px; margin-bottom: 10px; padding: 10px; border: 1px solid #ccc; border-radius: 4px; cursor: pointer; text-align: center; } </style> ``` 在上面的示例代码中,我们使用了 `ref` 来定义了一些响应式数据,包括 `showSelect`(是否显示下拉选择框)、`selected`(当前选中的选项)、`title`(选择框标题)和 `list`(选择框选项列表)。 我们在模板中定义了一个 `select-box` 元素,它是一个点击后可以弹出二级标题选择框的下拉选择框。在 `select-box` 元素中使用了一个箭头来指示下拉选择框的状态,当下拉选择框展开时,箭头会旋转 180 度。 我们使用了一个 `mask` 元素来实现一个半透明的遮罩层,可以在用户点击遮罩层时收起下拉选择框。 在 `select-popup` 元素中定义了二级标题选择框的样式。我们使用了一个 `title` 元素来显示当前选择框的标题,使用了一个 `list` 元素来显示选择框的选项。 在 `list` 元素中使用了一个 `v-for` 循环来渲染选择框的选项,当用户点击某个选项时,我们会调用 `handleItemClick` 方法来更新当前选中的选项,并收起下拉选择框。 最后,我们使用了 `setup` 函数来定义了 Vue3 的组合式 API,包括了响应式数据和处理选项点击事件的方法。这样写法的好处是,组件代码更加简洁,易于维护和扩展。
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端青山

您的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值