低代码可视化-uniapp开关选择组件-低码生成器

开关(Switch)选择组件是一种用户界面元素,允许用户在两种状态(通常是开/关、是/否、启用/禁用等)之间进行切换。这种组件在移动应用、桌面软件、网页以及物联网设备中广泛应用。以下是对开关Switch选择组件的详细介绍:

一、基本概念

开关Switch选择组件通常由一个滑块和一个滑道组成。滑块是用户可以拖动的部分,而滑道是背景。用户可以通过拖动滑块或点按开关来改变其状态。

二、主要属性

  1. 状态:
    • 表示开关的当前状态,通常是一个布尔值(true/false或1/0)。
  2. 状态改变回调:
    • 当开关状态发生变化时调用的回调函数。
    • 该函数通常接收一个新的状态值作为参数。
  3. 启用/禁用:
    • 控制开关是否可用。
    • 当设置为禁用状态时,用户无法更改开关的状态。
  4. 文本标签:
    • 在某些实现中,可以为开关的打开和关闭状态设置文本标签。
    • 这些标签通常用于提供更清晰的指示或说明。
  5. 颜色(colors):
    • 自定义开关的颜色,包括滑块和滑道的颜色。
    • 某些框架允许为开关的不同状态(打开/关闭)设置不同的颜色。

三、组件扩展

基于uview类型的u-switch我们增加了有效文本、无效文本及颜色。扩展组件如下。

<template>
	<view
		class="u-switch"
		:class="[valueCom? 'u-switch--on' : '', disabled ? 'u-switch--disabled' : '']"
		@tap="onClick"
		:style="[switchStyle]"
	>
		<view
			class="u-switch__node node-class"
			:style="nodeStyle"
		>
			<u-loading
				:show="loading"
				class="u-switch__loading"
				:size="size * 0.6"
				:color="loadingColor"
			/>
		</view>
		<view v-if="activeText || inactiveText" class="u-switch__text" :class="{'u-switch__text-end':!valueCom}" >
			<text v-if="!valueCom" class="u-switch__text--inactive"  :style="{color:inactiveTextColor}">{{ inactiveText }}</text>
			<text v-else class="u-switch__text--active" :style="{color:activeTextColor}">{{ activeText }}</text>
		</view>
	</view>
</template>

<script>
/**
 * switch 开关选择器
 * @description 选择开关一般用于只有两个选择,且只能选其一的场景。
 * @tutorial https://www.uviewui.com/components/switch.html
 * @property {Boolean} loading 是否处于加载中(默认false)
 * @property {Boolean} disabled 是否禁用(默认false)
 * @property {String Number} size 开关尺寸,单位rpx(默认50)
 * @property {String} active-color 打开时的背景色(默认#19be6b)
 * @property {Boolean} inactive-color 关闭时的背景色(默认#ffffff)
 * @property {Boolean | Number | String} active-value 打开选择器时通过change事件发出的值(默认true)
 * @property {Boolean | Number | String} inactive-value 关闭选择器时通过change事件发出的值(默认false)
 * @event {Function} change 在switch打开或关闭时触发
 * @example <u-switch v-model="checked" active-color="red" inactive-color="#eee"></u-switch>
 */
export default {
	name: "u-switch",
	emits: ["update:modelValue", "input", "change"],
	props: {
		// 通过v-model双向绑定的值
		value: {
			type: [Number, String, Boolean],
			default: false
		},
		modelValue: {
			type: [Number, String, Boolean],
			default: false
		},
		// 是否为加载中状态
		loading: {
			type: Boolean,
			default: false
		},
		// 是否为禁用装填
		disabled: {
			type: Boolean,
			default: false
		},
		// 开关尺寸,单位rpx
		size: {
			type: [Number, String],
			default: 50
		},
		// 打开时的背景颜色
		activeColor: {
			type: String,
			default: "#19be6b"
		},
		// 关闭时的背景颜色
		inactiveColor: {
			type: String,
			default: "#ffffff"
		},
		// 是否使手机发生短促震动,目前只在iOS的微信小程序有效(2020-05-06)
		vibrateShort: {
			type: Boolean,
			default: false
		},
		// 打开选择器时的值
		activeValue: {
			type: [Number, String, Boolean],
			default: true
		},
		// 关闭选择器时的值
		inactiveValue: {
			type: [Number, String, Boolean],
			default: false
		},
		activeText: {
			type: String,
			default: ''
		},
		activeTextColor: {
			type: String,
			default: "#ffffff"
		},
		inactiveText: {
			type: String,
			default: ''
		},
		inactiveTextColor: {
			type: String,
			default: "#999999"
		},
	},
	data() {
		return {
			switchWidth:this.size,
		};
	},
	computed: {
		valueCom() {
			// #ifndef VUE3
			return this.value;
			// #endif

			// #ifdef VUE3
			return this.modelValue;
			// #endif
		},
		switchStyle() {
			let style = {};
			style.fontSize = this.size + "rpx";
			style.backgroundColor = this.valueCom ? this.activeColor : this.inactiveColor;
			style.width = this.$u.addUnit(this.switchWidth*2);
			return style;
		},
		loadingColor() {
			return this.valueCom ? this.activeColor : null;
		},
		nodeStyle(){
			const style = {};
			style.width = this.$u.addUnit(this.size);
			style.height = this.$u.addUnit(this.size);
			style.transform = `translateX(${this.valueCom ? this.switchWidth - this.size/2 : 0}px)`;
			return style;
		}
	},
	methods: {
		onClick() {
			if (!this.disabled && !this.loading) {
				// 使手机产生短促震动,微信小程序有效,APP(HX 2.6.8)和H5无效
				if (this.vibrateShort) uni.vibrateShort();
				this.$emit("input", this.valueCom==this.activeValue ? this.inactiveValue : this.activeValue);
				this.$emit("update:modelValue", this.valueCom==this.activeValue ? this.inactiveValue : this.activeValue);
				// 放到下一个生命周期,因为双向绑定的value修改父组件状态需要时间,且是异步的
				this.$nextTick(() => {
					this.$emit("change", this.valueCom==this.activeValue ? this.inactiveValue : this.activeValu);
				});
			}
		},
		updateSwitchWidth() {
			let textLength = Math.max(this.activeText.length,this.inactiveText.length)
			this.switchWidth = Math.max(textLength*12+10+this.size/2, this.size)
		}
	},
	mounted() {
		this.updateSwitchWidth();
	},
};
</script>

<style lang="scss" scoped>
@import "../../libs/css/style.components.scss";

.u-switch {
	position: relative;
	/* #ifndef APP-NVUE */
	display: inline-block;
	/* #endif */
	box-sizing: initial;
	width: 2em;
	height: 1em;
	background-color: #fff;
	border: 1px solid rgba(0, 0, 0, 0.1);
	border-radius: 1em;
	transition: background-color 0.3s;
	font-size: 50rpx;
	&__text {
		position: absolute;
		top: 0;
		left: 0;
		right: 0;
		bottom: 0;
		display: flex;
		align-items: center;
		justify-content: space-between;
		padding: 0 10rpx;
		font-size: 24rpx;
		&-end{
			justify-content: flex-end;
		}
		&--inactive {
			color: #999999;
			white-space: nowrap;
			text-align: right;
		}
	
		&--active {
			color: #fff;
			white-space: nowrap;
		}
	}
}

.u-switch__node {
	@include vue-flex;
	align-items: center;
	justify-content: center;
	position: absolute;
	top: 0;
	left: 0;
	border-radius: 100%;
	z-index: 1;
	background-color: #fff;
	background-color: #fff;
	box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1),
		0 3px 3px 0 rgba(0, 0, 0, 0.05);
	box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1),
		0 3px 3px 0 rgba(0, 0, 0, 0.05);
	transition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);
	transition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05),
		-webkit-transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);
	transition: transform cubic-bezier(0.3, 1.05, 0.4, 1.05);
	transition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);
}

.u-switch__loading {
	@include vue-flex;
	align-items: center;
	justify-content: center;
}

.u-switch--on {
	background-color: #1989fa;
}

.u-switch--on .u-switch__node {
	transform: translateX(100%);
}

.u-switch--disabled {
	opacity: 0.4;
}
</style>

四、可视化设计

拖动开关组件进设计区。

保存源码至本地查看效果

<template>
	<view class="container container329152">
		<u-form-item class="diygw-col-24" label="开关" prop="switch">
			<view class="flex diygw-col-24">
				<u-switch :size="44" :activeValue="1" :inactiveValue="0" inactiveTextColor="#000000" activeTextColor="#ffffff" v-model="switched" slot="right"></u-switch>
			</view>
		</u-form-item>
		<u-form-item class="diygw-col-24" label="开关" prop="switch1">
			<view class="flex diygw-col-24">
				<u-switch :size="44" activeText="有效" inactiveText="无效" :activeValue="1" :inactiveValue="0" inactiveTextColor="#000000" activeTextColor="#ffffff" v-model="switch1" slot="right"></u-switch>
			</view>
		</u-form-item>
		<u-form-item class="diygw-col-24" label="开关" prop="switch2">
			<view class="flex diygw-col-24">
				<u-switch :size="44" activeText="男" inactiveText="女" :activeValue="1" :inactiveValue="0" inactiveTextColor="#000000" activeTextColor="#ffffff" v-model="switch2" slot="right"></u-switch>
			</view>
		</u-form-item>
		<view class="clearfix"></view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				//用户全局信息
				userInfo: {},
				//页面传参
				globalOption: {},
				//自定义全局变量
				globalData: {},
				listNum: 1,
				list: {
					code: 200,
					msg: '获取数据成功',
					data: [
						{
							title: '标题1',
							remark: '描述1',
							id: 1,
							attr: {
								title: '标题1'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题2',
							remark: '描述2',
							id: 2,
							attr: {
								title: '标题2'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题3',
							remark: '描述3',
							id: 3,
							attr: {
								title: '标题3'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题4',
							remark: '描述4',
							id: 4,
							attr: {
								title: '标题4'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题5',
							remark: '描述5',
							id: 5,
							attr: {
								title: '标题5'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题6',
							remark: '描述6',
							id: 6,
							attr: {
								title: '标题6'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题7',
							remark: '描述7',
							id: 7,
							attr: {
								title: '标题7'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题8',
							remark: '描述8',
							id: 8,
							attr: {
								title: '标题8'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题9',
							remark: '描述9',
							id: 9,
							attr: {
								title: '标题9'
							},
							img: 'https://php.diygw.com/logo.png'
						},
						{
							title: '标题10',
							remark: '描述10',
							id: 10,
							attr: {
								title: '标题10'
							},
							img: 'https://php.diygw.com/logo.png'
						}
					]
				},
				switched: 1,
				switch1: 1,
				switch2: 1
			};
		},
		onPageScroll(e) {
			const scrollTop = e.scrollTop;
			this.headerBackgroundStyle = this.headerBackgroundStyle || { background: 'none' };
			if (scrollTop <= 80) {
				const opacity = scrollTop / 100;
				const color = `rgba(255, 255, 255, ${opacity})`;
				this.headerBackgroundStyle.background = color;
			} else {
				this.headerBackgroundStyle.background = '#ffffff';
			}
		},
		onShow() {
			this.setCurrentPage(this);
		},
		onLoad(option) {
			this.setCurrentPage(this);
			if (option) {
				this.setData({
					globalOption: this.getOption(option)
				});
			}

			this.init();
		},
		methods: {
			async init() {
				await this.listApi();
			},
			// 列表数据 API请求方法
			async listApi(param) {
				let thiz = this;
				param = param || {};

				//如果请求要重置页面,请配置点击附加参数refresh=1  增加判断如输入框回调param不是对象
				if (param.refresh || typeof param != 'object') {
					this.listNum = 1;
				}

				//请求地址及请求数据,可以在加载前执行上面增加自己的代码逻辑
				let http_url = 'https://php.diygw.com/article.php';
				let http_data = {
					pageNum: this.listNum,
					pageSize: 10,
					sctdown: param.sctdown || this.sctdown
				};
				let http_header = {};

				let list = await this.$http.post(http_url, http_data, http_header, 'json');

				let datarows = list.rows;
				if (http_data.pageNum == 1) {
					this.list = list;
				} else if (datarows) {
					let rows = this.list.rows.concat(datarows);
					list.rows = rows;
					this.list = list;
				}
				if (datarows && datarows.length > 0) {
					this.listNum = this.listNum + 1;
				}
				this.globalData.isshow = true;
				console.log(http_data.sctdown);
			}
		},
		onPullDownRefresh() {
			// 列表数据 API请求方法
			this.listNum = 1;
			this.listApi();

			uni.stopPullDownRefresh();
		},
		onReachBottom() {
			// 列表数据 API请求方法
			this.listApi();
		}
	};
</script>

<style lang="scss" scoped>
	.container329152 {
	}
</style>

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

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

相关文章

蓝桥杯每日真题 - 第11天

题目&#xff1a;&#xff08;合并数列&#xff09; 题目描述&#xff08;14届 C&C B组D题&#xff09; 解题思路&#xff1a; 题意理解&#xff1a;给定两个数组&#xff0c;目标是通过若干次合并操作使两个数组相同。每次合并操作可以将数组中相邻的两个数相加&#xff…

【2024软考架构案例题】你知道什么是 RESTful 风格吗?

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

面试经典 150 题:20、2、228

20. 有效的括号 参考代码 #include <stack>class Solution { public:bool isValid(string s) {if(s.size() < 2){ //特判&#xff1a;空字符串和一个字符的情况return false;}bool flag true;stack<char> st; //栈for(int i0; i<s.size(); i){if(s[i] ( |…

NFS-Ganesha 核心架构解读

NFSv4 简要概述 NFS 这个协议( NFSv2 )最初由 Sun Microsystems 在 1984 年设计提出&#xff0c;由于存在一些不足&#xff0c;因此在随后由几家公司联合推出了 NFSv3。到了 NFSv4 时&#xff0c;开发完全由 IETF 主导&#xff0c;设计目标是&#xff1a; 提高互联下的 NFS 访…

由播客转向个人定制的音频频道(1)平台搭建

项目的背景 最近开始听喜马拉雅播客的内容&#xff0c;但是发现许多不方便的地方。 休息的时候收听喜马拉雅&#xff0c;但是还需要不断地选择喜马拉雅的内容&#xff0c;比较麻烦&#xff0c;而且黑灯操作反而伤眼睛。 喜马拉雅为代表的播客平台都是VOD 形式的&#xff0…

mysql数据库(五)多表查询

多表查询 文章目录 多表查询一、链表查询1.1交叉连接1.2 内连接1.3 左连接1.4 右连接1.5 全连接1.6 例子 二、子查询2.1 in与not in2.2 any/some2.3 all2.4 比较运算符2.5 exists 三、例子 查询中使用的表如下所示 ------------ | id | name | ------------ | 1 | IT | …

Redis设计与实现 学习笔记 第十七章 集群

Redis集群是Redis提供的分布式数据库方案&#xff0c;集群通过分片&#xff08;sharding&#xff0c;水平切分&#xff09;来进行数据共享&#xff0c;并提供复制和故障转移功能。 17.1 节点 一个Redis集群通常由多个节点&#xff08;node&#xff09;组成&#xff0c;在刚开…

分布式----Ceph部署

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09; 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…

【Qt聊天室客户端】消息功能--发布程序

1. 获取文件内容 主要目标是实现获取内容二进制数据的接口&#xff0c;主要是为后面的消息功能提供服务 具体实现 客户端发送请求 服务端处理请求&#xff0c;同时支持三种数据类型 客户端处理服务端的响应 2. 发送图片消息 客户端与服务端的通信约定 客户端从服务器中获取图片…

ab (Apache Bench)的使用

Apache Bench&#xff08;ab&#xff09;是一个用于基准测试HTTP Web服务器的命令行工具&#xff0c;广泛用于评估和优化Web服务器的性能。以下是关于Apache Bench的详细介绍&#xff0c;包括其功能、使用方法、常用参数和输出结果解析。 功能 性能测试&#xff1a;通过模拟多…

【HarmonyNext】显示提示文字的方法

【HarmonyNext】显示提示文字的方法 本文介绍在 HarmonyNext 中显示提示文字的两种常见方法&#xff1a;使用自定义弹窗 CustomDialog 和使用 promptAction 的 showToast 方法。 一、使用自定义弹窗 CustomDialog 在 HarmonyNext 中&#xff0c;自定义弹窗是实现复杂提示信…

第三十一天|贪心算法| 56. 合并区间,738.单调递增的数字 , 968.监控二叉树

目录 56. 合并区间 方法1&#xff1a;fff 看方法2&#xff1a;fff优化版 方法3&#xff1a; 738.单调递增的数字 968.监控二叉树&#xff08;贪心二叉树&#xff09; 56. 合并区间 判断重叠区间问题&#xff0c;与452和435是一个套路 方法1&#xff1a;fff 看方法2&am…

【自用】0-1背包问题与完全背包问题的Java实现

引言 背包问题是计算机科学领域的一个经典优化问题&#xff0c;分为多种类型&#xff0c;其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益&#xff0c;但它们之间存在一些关键的区别&#xff1a;0-1背包问题允许每个物品只能选择…

【Unity】ScriptableObject的应用:利用配方合成新物体

前一篇已经使用ScriptableObject(SO)类配置可放置物体&#xff0c;本篇探索更多的SO类应用场景。 需求分析 将若干指定物体放在工作台上&#xff0c;可以生成新的物体。 成果展示 Scene部分 准备工作台&#xff0c;放在工作台上的物体全部放在指定PlacedObjects空物体下。 …

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…

TofuAI处理BT1120时序视频要求

时序要求 BT.1120视频用于1920x108030Hz数字视频输入。具体时序必须严格按照说明。BT.1120输入电平为1.8V。 BT1120数字视频采用YCbCr彩色格式输出&#xff0c;串行数据位宽为16bit&#xff0c;亮度在 高8bit&#xff0c;色度在低8bit&#xff0c;亮度和色度在同一个时钟周期输…

C++内存池实现

1.内存池概念 内存池就和其他的池数据&#xff08;如线程池&#xff09;结构类似&#xff0c;由程序维护一个“池”结构来管理程序使用的内存&#xff0c;然后根据需要从内存池中申请使用内存或者向内存池中释放内存&#xff0c;来达到高效管理内存的目的。 在一般的内存管理的…

设计模式-参考的雷丰阳老师直播课

一般开发中使用的模式为模版模式策略模式组合&#xff0c;模版用来定义骨架&#xff0c;策略用来实现细节。 模版模式 策略模式 与模版模式特别像&#xff0c;模版模式会定义好步骤定义好框架&#xff0c;策略模式定义小细节 入口类 使用模版模式策略模式开发支付 以上使用…

Vue3打包自动生成版本JSON文件,添加系统版本检查,实现系统自动更新提示

实现该功能一共有三步。废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; 第一步&#xff1a;打包时自动生成版本信息的js文件&#xff0c;versionUpdate.js import fs from fs; import path from path; import { ElMessageBox } from element-plus; i…

华为云前台展示公网访问需要购买EIP,EIP流量走向

华为云前台网络&#xff08;VPC,安全组&#xff0c;EIP&#xff09; 1.EIP网段是从哪里划分的&#xff1f; 管理员在后台Service_OM已设置 Service_OM-网络资源-外部网络-创建外部网络基本信息&#xff1a;配置参数&#xff1a;*名称 public*网络类型 LOCAL 不带标签 类似开…