uniapp之actionsheet 自定义组件

uniapp本身自带的actionsheet太丑,不够美观。闲着也是闲着,自己实现了一个类似的选择器。

支持功能:

1、左对齐

2、右对齐

3、居中

4、可加图标

下面贴出使用教程:

<template>
    <view>
        <action-sheet alignment="left" :showSheetView="showSheetView" :displayCheckedIcon="true" :optionsList="deseaseList" titleKey="name" iconKey="cover" @onSelected="onSelected"></action-sheet>
    </view>
</template>
<script>
    import actionSheet from '@/components/zxp-uniActionSheet.vue'

    export default
    {
        data() {
            return {
                deseaseList: [],
                showSheetView:false
            };
        },
        components:{
            actionSheet
        },
        methods:{
            onSelected(row){
                /*这里必须将值置为false,否则无法唤起下一次的弹框显示*/
                this.showSheetView = false
            }
        }
    }
</script>

 组件实现代码:在你项目合适的目录中创建一个名为zxp-uniActionSheet.vue的组件文件,一般位于项目的components目录中,注意目录及页面中的引用位置!

或者直接通过hbuilderx引入到你的项目中!

actionsheet 自定义组件 - DCloud 插件市场

<template>
	<view class="view-modal" v-if="showSheetView" :class="[modalAnimation?'ani_start':'ani_end']">
		<view class="sheet-view" :class="[modalAnimation?'ani-top':'ani-btm']">
			<view class="head-view">
				<view class="cancel-view" @click="cancelAction">
					<text>取消</text>
				</view>
				<view class="title-view">
					<text>{{sheetTitle}}</text>
				</view>
				<view class="ok-view" @click="okAction">
					<text>确定</text>
				</view>
			</view>
			<scroll-view scroll-y="true" class="scroll-view">
				<view class="cell-row"
					:class="[alignment==='left'?'align-left':alignment==='right'?'align-right':'']"
					v-for="(item,index) in dataList" :key="index" @click.stop="didSelectedRow(index)">
					<image v-if="item[`${iconKey}`]" class="cell-icon" :src="item[`${iconKey}`]"></image>
					<text class="cell-label"
						:class="[index===selectIndex?'hilight-label':'',item[`${iconKey}`]?'':'cell-lb-pad']">{{item[`${titleKey}`]}}</text>
					<image v-if="displayCheckedIcon && index===selectIndex" class="cell-check-icon"
						:src="'data:image/png;base64,' + checkIconData"></image>
				</view>
			</scroll-view>
		</view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				viewTitle: null,
				selectIndex: 0,
				dataList: [],
				modalAnimation: false,
				checkIconData: ''
			};
		},
		props: {
			showSheetView: {
				type: Boolean,
				default: false
			},
			optionsList: {
				type: Array,
				default: []
			},
			titleKey: {
				type: String,
				default: ""
			},
			iconKey: {
				type: String,
				default: ""
			},
			defaultIndex: {
				type: Number,
				default: 0
			},
			sheetTitle: {
				type: String,
				default: "请选择"
			},
			alignment: {
				type: String,
				default: "center"
			},
			displayCheckedIcon: {
				type: Boolean,
				default: false
			},
			autoConfirm: {
				type: Boolean,
				default: true
			},
		},
		created() {
			this.viewTitle = this.sheetTitle
			this.selectIndex = this.defaultIndex
			this.dataList = this.optionsList
			
			let icon = 'iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAAXNSR0IArs4c6QAAAchJREFUeF7tmUFywjAMReXQi+QkDceCLgqLwrHgJrkIE3fClA5DE5AcyZJrsXZivecvOwkBKv+FyvnBBXgCKjfgLVB5AHwT9BbwFqjcgLdA5QHwU8BbwFugcgP/ogWar34HAT4jwHkVYH/ZtGfsuhYvIBz6UwDo7oGHbYvmQg/EGs05bgp+nL8JsMamoFgBc/BVCHgGDxH2w0e7wyaxuARwwo+SihLADV+UAAn4YgRIwRchQBKeLODt2HfY8xW7Cz8bJw2PFjCCDxFOv8USj5oUGTng0QImixGUkAseLaA59HFyFQUk5ITHC/h525KWkBseLeA6cOKti3NPkL7/3D5EehKUKlLqvpjNlyRAIgma8KQWuLfJVTTXfTArzdICnBIswCcn4CYiFSL1uiUrzZ6AVAmW4BcngCrBGjybAMzpEAO8P3695XyOSG0P8jGY/PY2d6HA4zRFBquAl0l4rEwZnrUF0EfkbaABeDEBL5NgBF5UwKwEQ/DiAv5IMAafRcA4yfWT2gAd5R8byk6+ZCz7KbCkGI1rXYCGdUtzegIsrYZGLZ4ADeuW5vQEWFoNjVo8ARrWLc3pCbC0Ghq1eAI0rFuas/oEfAN/0AhQ3IEvrwAAAABJRU5ErkJggg=='
			
			this.checkIconData = icon.replace(/[\r\n]/g, "");
		},
		computed: {
		},
		watch: {
			showSheetView: {
				handler: function(flag) {
					this.modalAnimation = flag
					this.dataList = this.optionsList
				},
				immediate: true
			}
		},
		methods: {
			cancelAction: function() {
				this.modalAnimation = false
				let self = this
				setTimeout(() => {
					// self.showSheetView = false
					self.$emit('onSelected', {
						'cancel': true
					})
				}, 350);
			},
			okAction: function() {
				this.modalAnimation = false
				let data = this.dataList[this.selectIndex]
				let self = this
				setTimeout(() => {
					// self.showSheetView = false
					self.$emit('onSelected', {
						data: data,
						'cancel': false,
						'confirm': true
					})
				}, 350);
			},
			didSelectedRow(row) {
				this.selectIndex = row
				if (this.autoConfirm)
				{
					this.okAction()
				}
			}
		}
	}
</script>

<style lang="scss" scoped>
	.scroll-view {
		width: 100%;
		height: 540upx;

		display: flex;
		flex-direction: column;
		justify-content: flex-start;
		align-items: center;
	}

	.cell-row {
		width: 100%;
		height: 88upx;
		border-bottom: 1px solid #eee;
		padding: 0upx 20upx;

		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
	}

	.cell-icon {
		width: 40upx;
		height: 40upx;
	}
	
	.cell-check-icon
	{
		position: absolute;
		right: 30upx;
		width: 40upx;
		height: 40upx;
	}

	.cell-label {
		padding:0upx 50upx 0upx 20upx;
		font-size: 14px;
		color: #333333;
		
		display: inline-block;
		overflow: hidden !important;
		text-overflow: ellipsis !important;
		white-space: nowrap !important;
		line-clamp: 1 !important;
	}
	
	.cell-lb-pad
	{
		padding:0upx 50upx;
	}

	.hilight-label {
		color: #0286df;
	}

	.align-left {
		justify-content: flex-start;
	}

	.align-right {
		justify-content: flex-end;
	}

	.ani_start {
		animation: animationShow 0.4s;
	}

	.ani_end {
		animation: animationHide 0.4s;
	}

	@keyframes animationShow {
		from {
			background-color: rgba(0, 0, 0, 0);
			opacity: 0;
		}

		to {
			background-color: rgba(0, 0, 0, 0.2);
			opacity: 1;
		}
	}

	@keyframes animationHide {
		from {
			background-color: rgba(0, 0, 0, 0.2);
			opacity: 1;
		}

		to {
			background-color: rgba(0, 0, 0, 0);
			opacity: 0;
		}
	}
	
	@keyframes slideBottom {
	    0% {
	        transform: translateY(100%)
	    }
	
	    100% {
	        transform: translateY(0)
	    }
	}
	

	.view-modal {
		position: fixed;
		top: calc(var(--status-bar-height) + 44px);
		// bottom: 0;
		height: calc(100% - var(--status-bar-height) - 44px);
		width: 100%;
		z-index: 1;

		display: flex;
		flex-direction: column;
		justify-content: flex-start;
		align-items: center;
		background-color: rgba(0, 0, 0, 0.2);
	}

	.ani-btm {
		transform: translateY(640upx);
	}

	.ani-top {
		animation: slideBottom 0.4s;
	}


	.sheet-view {
		position: absolute;
		bottom: 0upx;
		height: 640upx;
		width: 100%;
		transition: all 0.25s;
		background-color: white;

		display: flex;
		flex-direction: column;
		justify-content: flex-start;
		align-items: center;
	}

	.head-view {
		position: relative;
		width: calc(100% - 70upx);
		height: 100upx;

		display: flex;
		flex-direction: row;
		justify-content: space-between;
		align-items: center;
	}

	.cancel-view {
		position: relative;
		width: 124upx;
		height: 100%;

		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;

		text {
			position: relative;
			width: 100%;
			font-size: 32upx;
			color: #333333;

			text-align: left;
		}
	}

	.title-view {
		position: relative;
		height: 100%;

		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;

		text {
			position: relative;
			width: 100%;
			font-size: 30upx;
			color: #999999;

			text-align: left;
		}
	}

	.ok-view {
		position: relative;
		width: 124upx;
		height: 100%;

		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;

		text {
			position: relative;
			width: 100%;
			font-size: 32upx;
			color: #2197FF;

			text-align: right;
		}
	}

	.mid-view {
		position: relative;
		width: 100%;
		height: 106upx;

		border-bottom: 1upx solid rgb(235, 235, 235);
		border-top: 1upx solid rgb(235, 235, 235);
		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
	}

	.btn-view {
		position: relative;
		width: 50%;
		height: 100%;

		display: flex;
		flex-direction: row;
		justify-content: center;
		align-items: center;
	}

	.tt-view {
		position: relative;
		width: 100%;
		height: 100%;

		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
	}

	.normal-text {
		position: relative;
		width: 100%;
		font-size: 32upx;
		color: #555555;
		text-align: center;
	}

	.hili-text {
		position: relative;
		width: 100%;
		font-size: 32upx;
		color: #2197FF;
		text-align: center;
	}

	.active {
		background-color: white;
	}

	.non-active {
		background-color: rgb(245, 245, 245);
	}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/113383.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kafka、RabbitMQ、RocketMQ中间件的对比

消息中间件现在有不少&#xff0c;网上很多文章都对其做过对比&#xff0c;在这我对其做进一步总结与整理。 RocketMQ 淘宝内部的交易系统使用了淘宝自主研发的Notify消息中间件&#xff0c;使用Mysql作为消息存储媒介&#xff0c;可完全水平扩容&#xff0c;为了进一步降低成…

java spring cloud 工程企业管理软件-综合型项目管理软件-工程系统源码

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

告别菜鸟!快速精通ER图的绝招在这里!

当涉及到数据管理和数据库设计时&#xff0c;实体-关系图&#xff08;ER图&#xff09;无疑是最重要的工具之一。他们在数据模型设计过程中发挥着举足轻重的作用。但是&#xff0c;理解ER图并不是一项容易的任务。如果你对ER图感到困惑&#xff0c;我们提供了这一全面的指南&am…

如何在校园跑腿系统小程序中构建稳健的订单处理与分配系统?

1. 数据库设计 首先&#xff0c;设计订单数据结构。使用数据库&#xff08;例如MySQL、MongoDB等&#xff09;&#xff0c;创建订单表以存储订单相关信息&#xff0c;包括订单ID、用户信息、交付地址、订单状态等。 CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMAR…

Java实现对Html文本的处理

1.引入jsoup <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version> </dependency> 2. html示例 示例代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…

Ubuntu 使用 nginx 搭建 https 文件服务器

Ubuntu 使用 nginx 搭建 https 文件服务器 搭建步骤安装 nginx生成证书修改 config重启 nginx 搭建步骤 安装 nginx生成证书修改 config重启 nginx 安装 nginx apt 安装&#xff1a; sudo apt-get install nginx生成证书 使用 openssl 生成证书&#xff1a; 到对应的路径…

第十三章,枚举与泛型例题

例题1 package 例题;interface SeasonInterface{//四季接口int SPRING 1, SUMMER 2, AUTUMN 3, WINTER 4; }enum SeasonEnum{//四季枚举SPRING,SUMMER,AUTUMN,WINTER }public class 例题1 {//定义方法public static void printSeason1(int season){switch (season) {case …

【计算机网络】应用层——HTTPS协议

目录 HTTPS协议加密对称加密非对称加密 数据摘要&#xff08;数据指纹&#xff09;HTTPS安全问题对称加密非对称加密 证书客户端认证查看客户端证书 解决数据安全问题&#xff08;引入证书&#xff09; HTTPS协议 HTTP 协议内容都是按照⽂本的⽅式明⽂传输的. 这就导致在传输过…

使用shardingJDBC中的雪花算法生成id

常用ID解决方案 数据库自增id 依靠数据库系统的功能实现&#xff0c;但是未来扩容麻烦主从切换时的不⼀致可能会导致重复发号性能瓶颈存在单台sql上 UUID 性能非常高&#xff0c;没有网络消耗无序的字符串&#xff0c;不具备趋势自增特性UUID太长&#xff0c;不易于存储&am…

Ubuntu系统HUSTOJ 用 vim 修改php.ini 重启PHP服务

cd / sudo find -name php.ini 输出&#xff1a; ./etc/php/7.4/cli/php.ini ./etc/php/7.4/fpm/php.ini sudo vim /etc/php/7.4/cli/php.ini sudo vim /etc/php/7.4/fpm/php.ini 知识准备&#xff1a; vim的搜索与替换 在正常模式下键入 / &#xff0c;即可进入搜索模式…

7个UI设计必备课程,小白必看!

无论你是想提高技能的资深UI设计师还是网站开发人员&#xff0c;又或者是刚转行不久的UI设计新手&#xff0c;学习UI设计课程都会让你做出更美观、更有影响力的UI界面设计作品。现在网上有很多网上的UI设计课程。通过这些课程&#xff0c;你可以自己学习、掌握一些UI设计的基础…

PC端视频编辑处理的全方位解决方案

视频已经成为企业传播信息、展示品牌形象的重要工具。然而&#xff0c;制作高质量的视频并非易事&#xff0c;需要专业的技术和设备。这就是美摄科技发挥作用的地方。我们为企业提供一站式的PC端视频编辑处理解决方案&#xff0c;帮助企业轻松制作出专业级别的视频。 美摄科技…

最新版一媒体7.3、星媒体、皮皮剪辑,视频MD ,安卓手机剪辑去重神器+搬运脚本+去视频重软件工具

最新版一媒体app安卓版介绍&#xff1a; 这是一款功能强大的视频搬运工具&#xff0c;内置海量视频编辑工具&#xff0c;支持一键智能化处理、混剪、搬运、还能快速解析和去水印等等&#xff0c;超多实用功能等着您来体验&#xff01; 老牌手机剪辑去重神器&#xff0c;用过的…

2103. 环和杆

2103. 环和杆 难度: 简单 来源: 每日一题 2023.11.02 总计有 n 个环&#xff0c;环的颜色可以是红、绿、蓝中的一种。这些环分别穿在 10 根编号为 0 到 9 的杆上。 给你一个长度为 2n 的字符串 rings &#xff0c;表示这 n 个环在杆上的分布。rings 中每两个字符形成一个…

sass相关

1、代码简化 1.1、简化媒介查询 mixin flex{display: flex;justify-content: center;align-items: center; } .header{width: 100%;include flex;//可以这样引用 }//加入参数 mixin flex($layout){display: flex;justify-content: $layout;align-items: $layout; } .header{w…

Android开发知识学习——Kotlin进阶

文章目录 次级构造主构造器init 代码块构造属性data class相等性解构Elvis 操作符when 操作符operatorLambda循环infix 函数嵌套函数注解使用处目标函数简化函数参数默认值扩展函数类型内联函数部分禁用用内联具体化的类型参数抽象属性委托属性委托类委托 Kotlin 标准函数课后题…

Springboot项目Eureka安全加密

一、通过security增加账号密码登录 1、registry服务pom增加security依赖 2、registry 配置文件 指定security账号密码 3、http://账号:密码IP:PORT/eureka/ 4、重启 二、关闭节点 三、防火墙移除eureka端口访问 参考&#xff1a;Linux(Centos7)操作记录

C#编程中字符串公式的计算

在一个程序开发当中&#xff0c;有很多涉及到公式的定义与计算&#xff0c;在用户给定的文档中&#xff0c;公式采用字符串形式定义&#xff0c;包含了一些变量名和各种运算符号&#xff0c;程序需要先进行字符变量的值替换后再进行计算&#xff0c;取得结果后再进行后续的操作…

【计算系统】5分钟了解超算,高性能计算,并行计算,分布式计算,网格计算,集群计算以及云计算的区别

5分钟了解超算&#xff0c;高性能计算&#xff0c;并行计算&#xff0c;分布式计算&#xff0c;网格计算&#xff0c;集群计算以及云计算的区别 1. 超算2. 高性能计算3. 并行计算4. 分布式计算5. 网格计算6. 集群计算7. 云计算小结相关资料 1. 超算 超级计算机&#xff08;Sup…

文具办公用品展示预约小程序的作用是什么

文具办公用品的应用度非常高&#xff0c;市场众多企业&#xff0c;虽然目前不少已经实现电子化办公&#xff0c;但如铅笔、橡皮、色板、文件袋等依然有消费性&#xff0c;同时这些产品一般适用于批量采购&#xff0c;但在实际经营中&#xff0c;线上冲击和各商家竞争激烈&#…
最新文章