uniapp 实现下拉选择,输入查询的功能

封装代码组件custom-downSearch.vue 组件
<template>
    <div class="drop-down-search" @click.stop>
      <view style="display: flex; align-items: center;">
        <input
          @focus="handleFocus" 
          @blur="closeDropDown"  
          :style="{height: '100%', paddingRight: clear? '60rpx' : '16rpx', display: 'flex'}" 
          type="text" 
          v-model="searchText" 
          @input="handleSearch" 
          :placeholder="placeholder"/>

        <text v-if="searchText.length && clear" @click="handleClearInput" class="iconfont icon-shanchu"></text>
        <view 
          @click="handleDropDownBox" 
          v-if="icon" 
          :class="['dropdown-container', { rotated:  isDropDownVisible}]"
        ></view> <!-- 添加小三角图标 -->
      </view>

      <scroll-view 
        :scroll-y="true" 
        class="dropdown-scroll" 
        :style="{ maxHeight: (isDropDownVisible && hasOptions) ? dropdownHeight + 'rpx' : '0rpx' }">
        <div class="dropdown-content">
          <div v-for="(option, index) in filteredOptions" :key="index" class="option" @click="selectOption(option, $event)">
            {{ option }}
          </div>
        </div>
      </scroll-view>

    </div>
  </template>
  
  <script>
  export default {
    props: {
      options: {
        type: Array,
        default: []
      },
      value: {
        type: [String,  Number], 
        default: ''
      },
      dropdownHeight: {  // 下拉框的高度
        type: Number,
        default: 200
      },
      placeholder: {
        type: String,
        default: ''
      },
      icon: {
        type: Boolean,
        default: true
      },
      clear: {
        type: Boolean,
        default: true,
      }
    },
    data() {
      return {
        searchText: this.value.toString(), // 默认将数字转字符串
        isDropDownVisible: false,
        hasOptions: false,
      };
    },
    computed: {
      // 根据搜索文本过滤选项
      filteredOptions() {
        return this.options.filter(option =>
          option.toLowerCase().includes(this.searchText.toLowerCase())
        );
      }
    },
    watch: {  // 监听 options 数组,要是输入的东西没有,就关闭下拉框
        searchText() {
          // this.hasOptions = (this.filteredOptions.length > 0)
        },
    },
    mounted() {
        // 添加点击外部关闭下拉框的事件监听器
        document.addEventListener('click', this.closeDropDown.bind(this));
        
    },
    beforeDestroy() {
        // 移除事件监听器以防止内存泄漏
        document.removeEventListener('click', this.closeDropDown.bind(this));
    },
    methods: {
      handleClearInput() { // 清除 input 输入框内容
        this.searchText = ''
        this.$emit('input',''); // 向父组件传递选中的值 // 重新获取新的数据
      },
      handleDropDownBox() { // 控制三角图表事件
        this.isDropDownVisible = !this.isDropDownVisible
        this.hasOptions = (this.filteredOptions.length > 0)
      },
      // 处理搜索事件
      handleSearch(e) {
        this.$emit('input', e.target.value); // 向父组件传递选中的值
        this.isDropDownVisible = this.hasOptions;
      },
      handleFocus() {
        this.isDropDownVisible = true;
        this.hasOptions = true;
      },
      // 选择选项
      selectOption(option, event) {
        event.stopPropagation();
        // 处理选项选择逻辑,比如触发事件、更新绑定值等
        this.searchText = option; // 选中选项后更新搜索文本
        this.isDropDownVisible = false; // 隐藏下拉框
        this.hasOptions = false;
        this.$emit('changeInput', option); // 向父组件传递选中的值
      },
      // // 获取当前输入的值
      // getSearchText() { 
      //   return this.searchText;
      // },
      closeDropDown() {
        // 点击事件的目标不包含搜索框或下拉框时,隐藏下拉框
        // this.isDropDownVisible = true;
        // this.hasOptions = true;

        if (!this.$el.contains(event.target)) {
          this.isDropDownVisible = false;
        }
      }
    }
  };
  </script>
  
  <style scoped>
  .drop-down-search {
    position: relative;
    height: 100% !important;
  }
  
  .dropdown-scroll {
    position: absolute;
    top: calc(100% + 12rpx);
    left: 0;
    width: 100%;
    background: #fff;
    z-index: 99;
    /* border: 1rpx solid #ccc; */
    box-shadow: 0 14rpx 30rpx rgb(0, 0, 0, 0.1);
    transition: max-height 0.3s ease;
  }
  
  .dropdown-content {
    padding: 10rpx;
  }
  
  .option {
    padding: 10rpx;
    cursor: pointer;
    border-bottom: 1rpx solid #ccc;
  }
  
  input {
    width: 100%;
    padding: 10rpx;
    box-sizing: border-box;
  }

  .iconfont {
    position: absolute;
    top: 50%;
    right: 55rpx;
    font-size: 50rpx;
    transform: translateY(-50%);
    font-size: 20rpx;
    color: #999;
    cursor: pointer;
  }
  .dropdown-container {  
    position: relative;  
    width: 30rpx; 
    height: 30rpx; 
    margin-right: 10rpx;
    transform:  rotate(180deg); 
  }  
  
  .dropdown-container::before {  
    content: '';  
    position: absolute;  
    top: 50%;  
    left: 50%;  
    transform: translate(-50%, -50%); 
    width: 0;  
    height: 0;  
    border-left: 15rpx solid transparent;  
    border-right: 15rpx solid transparent;  
    border-bottom: 15rpx solid #ccc; /* 使用border-bottom创建向下的三角形 */  
    transition: transform 0.3s ease; /* 添加过渡效果 */  
  }  
    
  .rotated::before {  
    transform: translate(-50%, -50%) rotate(180deg); /* 旋转三角形 */  
  } 
  </style>

组件使用

<customDownSearch
	style="flex: 1; height: 30rpx; border: 1rpx solid #ccc; font-size: 30rpx;"
	:options="stateListCom"
	:value="form.dingdanStatus"
	v-model="form.dingdanStatus"
	@changeInput="changeInput2"
	@input="handleInput2"
></customDownSearch>

import customPagination from '@/components/custom-pagination/custom-pagination.vue'

components:{
    customPagination,
},

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是一个简单的uniapp下拉搜索框的Vue3写法: template部分: ```html <template> <div> <input v-model="searchText" type="text" placeholder="输入关键字搜索" @input="search" /> <ul> <li v-for="(item, index) in searchResult" :key="index">{{ item }}</li> </ul> </div> </template> ``` script部分: ```javascript <script> import { ref } from 'vue' export default { name: 'Search', setup() { const searchText = ref('') const searchResult = ref([]) const search = () => { // 在此处调用接口或处理数据 // 将结果存储在 searchResult 中 } return { searchText, searchResult, search } } } </script> ``` 以上代码中,使用了Vue3的新特性ref来定义searchText和searchResult变量,以及search方法。其中,search方法可以在输入输入内容时被触发,可以在此处调用接口或进行数据处理,并将结果存储在searchResult中,最终在模板中渲染出搜索结果。 ### 回答2: 在Uniapp中使用Vue3编写下拉搜索框,可以按照以下步骤进行操作: 1. 首先,安装uni-ui插件,该插件提供了下拉搜索框组件:uni-load-more。 2. 在需要使用下拉搜索框的页面或组件中,引入uni-load-more组件: ```vue <template> <view> <uni-load-more ref="loadmore" :loadmore-method="loadmore" :is-no-more="isNoMore"> <view slot="content"> <!--下拉搜索框内容区域--> </view> </uni-load-more> </view> </template> <script> import uniLoadMore from '@dcloudio/uni-ui/lib/uni-load-more/uni-load-more.vue'; export default { components: { uniLoadMore }, data() { return { isNoMore: false // 是否还有更多数据供加载 } }, methods: { loadmore() { // 加载更多数据的方法 } } } </script> ``` 3. 在`data`中定义`isNoMore`变量来控制是否还有更多数据供加载,在`loadmore`方法中实现加载更多数据的逻辑。 4. 在`<view slot="content">`标签内添加下拉搜索框的内容区域。 5. 根据具体需求,可以在`<template>`标签中添加样式来美化下拉搜索框。 ### 回答3: 在uniapp实现下拉搜索框可以使用Vue3的写法,具体步骤如下: 1. 创建一个Vue组件,命名为SearchBox,使用组件化的思想将下拉搜索框封装起来。 2. 在SearchBox组件中,使用template标签编写组件的HTML结构,包含一个输入框和一个下拉列表。使用input事件监听用户输入的关键字,并通过v-model绑定到data中的keyword变量上。 3. 在data中定义一个列表变量list,用于存储搜索结果列表。在methods中编写一个search方法,当用户输入关键字时,通过接口请求后端数据,并将返回的结果赋值给list变量。 4. 在组件的HTML结构中,使用v-if指令判断当list有数据时显示下拉列表,使用v-for指令遍历list,展示每一条搜索结果。 5. 使用@focus事件监听输入框的获得焦点事件,当输入框获得焦点时,显示下拉列表。 6. 使用@click事件监听下拉列表项的点击事件,当用户点击某个搜索结果时,将该搜索结果赋值给keyword变量,并触发一个事件,将选中的结果发送到父组件。 7. 在父组件中使用SearchBox组件,并监听SearchBox的事件,获取选中的搜索结果,并进行后续处理,如显示详细信息或进行页面跳转等。 以上是使用Vue3编写uniapp下拉搜索框的步骤,通过封装组件的方式可以实现代码的复用,提高开发效率。可以根据具体的需求对组件进行扩展,添加更多的交互功能和样式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值