uni-app微信小程序——下拉多选框

这篇具有很好参考价值的文章主要介绍了uni-app微信小程序——下拉多选框。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

插件来自:select-cy - DCloud 插件市场

uni-app微信小程序——下拉多选框

 文章来源地址https://www.toymoban.com/news/detail-506143.html

1、组件代码

<template>
  <view class="uni-select-cy" :style="{ 'z-index': zindex }">
    <view class="uni-select-cy-select" :class="{ active: active }" @click.stop="handleSelect">
      <!-- 禁用mask -->
      <view class="uni-disabled" v-if="disabled"></view>
      <!-- 清空 -->
      <view class="close-icon close-postion" v-if="realValue.length && !active && !disabled && showClearIcon">
        <text @click.stop="handleRemove(null)"></text>
      </view>
      <!-- 显示框 -->
      <view class="uni-select-multiple" v-show="realValue.length">
        <view class="uni-select-multiple-item" v-for="(item, index) in realValue" :key="index">
          {{ item }}
          <view class="close-icon" v-if="showValueClear"><text @click.stop="handleRemove(index)"></text> </view>
        </view>
      </view>
      <!-- 为空时的显示文案 -->
      <view v-if="realValue.length == 0 && showplaceholder">{{ placeholder }}</view>
      <!-- 禁用图标 -->
      <view class="uni-select-cy-icon" :class="{ disabled: disabled }"><text></text></view>
    </view>
    <!-- 下拉选项 -->
    <scroll-view class="uni-select-cy-options" :scroll-y="true" v-show="active">
      <template>
        <view
          class="uni-select-cy-item"
          :class="{ active: realValue.includes(item[svalue]) }"
          v-for="(item, index) in options"
          :key="index"
          @click.stop="handleChange(index, item)"
        >
          {{ item[slabel] }}
        </view>
      </template>
    </scroll-view>
  </view>
</template>

<script>
export default {
  name: 'select-cy',
  props: {
    // 是否显示全部清空按钮
    showClearIcon: {
      type: Boolean,
      default: false,
    },
    // 是否显示单个删除
    showValueClear: {
      type: Boolean,
      default: true,
    },
    zindex: {
      type: Number,
      default: 999,
    },
    // 禁用组件
    disabled: {
      type: Boolean,
      default: false,
    },
    options: {
      type: Array,
      default() {
        return [];
      },
    },
    value: {
      type: Array,
      default() {
        return [];
      },
    },
    placeholder: {
      type: String,
      default: '请选择',
    },
    showplaceholder: {
      type: Boolean,
      default: true,
    },
    slabel: {
      type: String,
      default: 'text',
    },
    svalue: {
      type: String,
      default: 'value',
    },
  },
  data() {
    return {
      active: false, // 组件是否激活,
      changevalue: [], // 搜索框同步
      realValue: [],
    };
  },
  mounted() {
    // 初始化
    this.init();
  },
  methods: {
    close() {
      this.active = false;
    },
    init() {
      if (this.value.length > 0) {
        this.changevalue = this.options.forEach((item) => {
          this.value.forEach((i) => {
            if (item[this.svalue] === i[this.svalue]) {
              return item;
            }
          });
        });
        this.realValue = this.value;
      } else {
        this.changevalue = [];
        this.realValue = [];
      }
    },
    // 点击展示选项
    handleSelect() {
      if (this.disabled) return;
      this.active = !this.active;
    },
    // 移除数据
    handleRemove(index) {
      if (index === null) {
        this.realValue = [];
        this.changevalue = [];
      } else {
        this.realValue.splice(index, 1);
        this.changevalue.splice(index, 1);
      }
      this.$emit('change', this.changevalue, this.realValue);
    },
    // 点击组件列
    handleChange(index, item) {
      const arrIndex = this.realValue.indexOf(item[this.svalue]);
      if (arrIndex > -1) {
        this.changevalue.splice(arrIndex, 1);
        this.realValue.splice(arrIndex, 1);
      } else {
        this.changevalue.push(item);
        this.realValue.push(item[this.svalue]);
      }
      console.log(this.realValue, 'this.realValue');
      this.$emit('change', this.changevalue, this.realValue);
    },
  },
};
</script>

<style lang="scss" scoped>
.uni-select-cy {
  position: relative;
  z-index: 999;

  .uni-select-mask {
    width: 100%;
    height: 100%;
  }

  /* 删除按钮样式*/
  .close-icon {
    height: 100%;
    width: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 3;
    cursor: pointer;

    text {
      position: relative;
      background: #c0c4cc;
      width: 13px;
      height: 13px;
      border-radius: 50%;
      border: 1px solid #bbb;

      &::before,
      &::after {
        content: '';
        position: absolute;
        left: 20%;
        top: 50%;
        height: 1px;
        width: 60%;
        transform: rotate(45deg);
        background-color: #909399;
      }

      &::after {
        transform: rotate(-45deg);
      }
    }
  }

  //所有情空的定位
  .close-postion {
    position: absolute;
    right: 35px;
    top: 0;
    height: 100%;
    width: 15px;
  }

  /* 多选盒子 */
  .uni-select-multiple {
    overflow-x: auto;
    display: flex;

    .uni-select-multiple-item {
      background: #f4f4f5;
      margin-right: 5px;
      padding: 2px 4px;
      border-radius: 4px;
      color: #909399;
      display: flex;
    }
  }

  // select部分
  .uni-select-cy-select {
    user-select: none;
    position: relative;
    z-index: 3;
    height: 36px;
    padding: 0 30px 0 10px;
    box-sizing: border-box;
    border-radius: 4px;
    border: 1px solid rgb(229, 229, 229);
    display: flex;
    align-items: center;
    font-size: 14px;
    color: #999;

    .uni-disabled {
      position: absolute;
      left: 0;
      width: 100%;
      height: 100%;
      z-index: 19;
      cursor: no-drop;
      background: rgba(255, 255, 255, 0.5);
    }

    .uni-select-cy-input {
      font-size: 14px;
      color: #999;
      display: block;
      width: 96%;
      overflow: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
      line-height: 30px;
      box-sizing: border-box;

      &.active {
        color: #333;
      }
    }

    .uni-select-cy-icon {
      cursor: pointer;
      position: absolute;
      right: 0;
      top: 0;
      height: 100%;
      width: 30px;
      display: flex;
      align-items: center;
      justify-content: center;

      &::before {
        content: '';
        width: 1px;
        height: 100%;
        position: absolute;
        left: 0;
        top: 0;
        background-color: #e5e5e5;
      }

      text {
        display: block;
        width: 0;
        height: 0;
        border-width: 12rpx 12rpx 0;
        border-style: solid;
        border-color: #bbb transparent transparent;
        transition: 0.3s;
      }

      &.disabled {
        cursor: no-drop;

        text {
          width: 20rpx;
          height: 20rpx;
          border: 2px solid #ff0000;
          border-radius: 50%;
          transition: 0.3s;
          position: relative;
          z-index: 999;

          &::after {
            content: '';
            position: absolute;
            top: 50%;
            left: 0;
            width: 100%;
            height: 2px;
            margin-top: -1px;
            background-color: #ff0000;
            transform: rotate(45deg);
          }
        }
      }
    }

    &.active .uni-select-cy-icon {
      text {
        transform: rotate(180deg);
      }
    }
  }

  // options部分
  .uni-select-cy-options {
    user-select: none;
    position: absolute;
    top: calc(100% + 5px);
    left: 0;
    width: 100%;
    height: 500rpx;
    border-radius: 4px;
    border: 1px solid rgb(229, 229, 229);
    background: #fff;
    padding: 5px 0;
    box-sizing: border-box;
    z-index: 9;

    .uni-select-cy-item {
      padding: 0 10px;
      box-sizing: border-box;
      cursor: pointer;
      line-height: 2.5;
      transition: 0.3s;
      font-size: 14px;

      &.active {
        color: #409eff;

        background-color: #f5f7fa &hover {
          color: #409eff;
          background-color: #f5f7fa;
        }
      }

      &:hover {
        background-color: #f5f5f5;
      }
    }
  }
}
</style>

2、使用说明

## 插件使用方法:

`<select-lay :value="tval" name="name" :options="datalist" @selectitem="selectitem"></select-lay>`

## 配置参数:

|     属性名      |  类型   | 默认值 | 说明                                             |
| :-------------: | :-----: | :----: | ------------------------------------------------ |
|  showClearIcon  | Boolean | false  | 是否显示全部清空按钮                             |
| showValueClear  | Boolean |  true  | 是否显示单个删除                                 |
|     zindex      | Number  |   ""   | 层级,默认 999,防止多个组件一起使用时下拉栏穿透 |
|     slabel      | String  |  text  | 自定义列表中键值对关系,参考示例                 |
|     svalue      | String  | value  | 自定义列表中键值对关系,该值对应 value,参考示例 |
|   placeholder   | String  | 请选择 | 无选项时展示的文字                               |
| showplaceholder | Boolean |  true  | 下拉时是否展示请选择按钮                         |
|     options     |  Array  |   无   | 数据列表                                         |
|    disabled     | Boolean | false  | 是否禁用                                         |
|      value      |  Array  |   无   | 选中值及回显                                     |

## 事件:

| 事件名  |            说明            | 返回值                              |
| :-----: | :------------------------: | ----------------------------------- |
| @change | 点击项目或者删除触发的事件 | 返回全量选中项及只有 value 的选中项 |

## 说明:

此插件依赖 scss,请务必安装!!!

## 示例:

```
	<template>
		<view class="content">
			<form @submit="formSubmit">
				<view class="item">写法:</view>
				<select-cy :value="tval" placeholder="请选择项目" :options="datalist" @change="change"></select-cy>
				<select-cy :value="tval" placeholder="请选择项目1" :options="datalist" @change="change"></select-cy>
				<button type="submit" @click="formSubmit">提交</button>
			</form>
		</view>
	</template>

	<script>
	export default {
		data() {
			return {
				//模拟数据列表
				datalist: [],
				//模拟初始数据
				tval: []
			};
		},
		onReady() {
			this.datalist = [
				{
					label: 'label1',
					value: 'value1'
				},
				{
					label: 'label2',
					value: 'value2'
				},
				{
					label: 'label3',
					value: 'value3'
				},
				{
					label: 'label4',
					value: 'value4'
				},
				{
					label: 'label5',
					value: 'value5'
				},
				{
					label: 'label6',
					value: 'value6'
				},
				{
					label: 'label7',
					value: 'value7'
				},
				{
					label: 'label8',
					value: 'value8'
				},
				{
					label: 'label9',
					value: 'value9'
				}
			];
		},
		methods: {
			formSubmit(e) {
				console.log(this.tval,'提交参数');
			},
			change(item,value) {
				console.log(item,value);
				this.tval = value;
			}
		}
	};
	</script>

	<style lang="scss">
	.content {
		width: 300px;
		padding: 20px 0;
		margin: 0 auto;

		.item {
			margin-bottom: 10px;
		}

		.btn {
			margin-top: 20px;
		}
	}
	</style>


```

到了这里,关于uni-app微信小程序——下拉多选框的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【uni-app微信小程序】实现支付功能

    实现微信支付功能需要在小程序后台配置支付相关信息,并且在前端代码中调用微信支付API进行支付操作。好的, uni-app微信小程序实现支付功能整体流程 大致如下: 注册微信公众平台,并完成开发者资质认证; 在微信商户平台注册商户账号,并完成商户资质认证; 在商户

    2024年02月13日
    浏览(56)
  • uni-app微信小程序使用echarts

    前言:本来是使用的ucharts,但因为无法监听图例点击交互,满足不了需求,所以只能放弃。 首先,下载echart组件。可以先随便建个文件夹,然后 npm init。接着下载依赖 然后找到 node_modulesmpvue-echarts下的文件,如图 只留下src,其他的删掉(没有用到)。然后复制 mpvue-echart

    2024年02月10日
    浏览(40)
  • uni-app 微信小程序 激励视频广告

    封装激励视频-Ad.js 调用上面写的方法:

    2024年02月12日
    浏览(49)
  • uni-app(微信小程序)获取当前位置uni.getLocation

     1、微信公众平台  开发  开发管理   2、开通之后到项目文件    3、下载腾讯地图插件并引入到文件中    

    2024年02月11日
    浏览(35)
  • [uni-app] 微信小程序 如何修改替换头像

     如下图所示,微信小程序中涉及到修改头像的交互 技术: 前端应用框架为uni-app UI框架为uView  思考: 1. 头像点击事件 click 2.从本地相册选择图片或使用相机拍照 uni.chooseImage(OBJECT) ,方法执行成功后根据success中返回的图片的本地文件路径列表 tempFilePaths,做操作 3.上传图片

    2024年02月11日
    浏览(40)
  • uni-app 微信小程序 onReachBottom 不生效

    问题描述: uni-app 微信小程序,页面滑到底部,onReachBottom 没有生效 代码: pages.json 配置 使用 onReachBottom 的页面: 总结: 最外层容器设置 min-height: 100.1vh

    2024年02月07日
    浏览(32)
  • [uni-app]设置运行到微信小程序

    1、设置微信小程序开发工具路径 2、检查微信小程序开发工具是否开启了服务端口 服务端口要是没有开启,会报 × initialize。 3、在uni-app开发工具中点击运行微信开发者工具,微信开发工具运行成功。

    2024年02月13日
    浏览(41)
  • 微信小程序修改原生组件样式(uni-app)

    微信小程序修改原生组件样式 全局修改,直接将修改的样式写在全局的样式文件中; 特殊情况:修改swiper指示点样式时,需要包裹在swiper的样式选择器下才生效。 直接将下列代码放在全局样式中是不会生效的,需要加上swiper组件的元素选择器或swiper组件的其他样式名也可。

    2024年02月05日
    浏览(39)
  • uni-app微信小程序如何渲染markdown

    在开发个人网站微信登录平台易登微信小程序的时候,由于说明文档是用markdown格式来书写的,在网页上有各种markdown个人渲染引擎,比如这个markdown编辑器无敌了!。 但是在小程序上还是第一次渲染markdown,找了各种方案,但处处是坑,除此之外最后渲染出来的效果也惨不忍

    2024年02月16日
    浏览(41)
  • uni-app 微信小程序自定义导航栏

    上面的导航栏主要由状态栏(就是手机电量显示栏)和小程序的导航栏组成,android手机一般为48px,ios手机一般为44px 1、设置navigationStyle:custom 2、页面导航栏div 3、获取statusBarHeight高度 4、获取navTitleHeight的高度

    2024年02月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包