javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > uni-app自定义角标数字键盘弹窗

在uni-app项目中自定义角标数字键盘弹窗的实现方案

作者:Jiaberrr

在 uni-app 项目开发中,经常会遇到需要输入角标数字(如下标、上标)的场景(例如化学公式、数学表达式、特殊标注等),因此本文将分享一个自定义角标数字键盘弹窗的实现方案,需要的朋友可以参考下

在 uni-app 项目开发中,经常会遇到需要输入角标数字(如下标、上标)的场景(例如化学公式、数学表达式、特殊标注等)。UniApp 原生键盘不支持角标数字输入,因此本文将分享一个自定义角标数字键盘弹窗的实现方案,支持上标数字(1234567890)和负号(-)输入,可直接集成到项目中使用。

一、组件功能说明

  1. 支持 0-9 上标数字(1234567890)和上标负号(-)输入
  2. 弹窗从底部弹出,支持自定义弹窗高度
  3. 点击键盘按钮触发输入事件,通过回调返回选中的角标字符
  4. 支持手动控制弹窗的打开和关闭
  5. 适配 UniApp 多端运行(H5、小程序、App 等)

二、完整组件代码

<template>
	<!-- 底部弹窗容器,使用 uni-popup 实现弹窗基础功能 -->
	<uni-popup 
		ref="popup" 
		type="bottom" 
		background-color="#fff" 
		borderRadius="60rpx 60rpx 0 0"
	>
		<!-- 键盘容器,支持自定义高度和内边距 -->
		<view 
			class="w-p-100 mt-30 pr-15 pl-15 pb-15 border-box overflow-y" 
			:style="{height:height}"
		>
			<!-- 键盘按钮区域,使用 grid 布局实现6列均匀分布 -->
			<view class="keyboard-content h-p-100">
				<view 
					v-for="item in charts" 
					:key="item.id" 
					class="key-item"  
					@click="handleInput(item.value)"
				>
					{{item.value}}
				</view>
			</view>
		</view>
	</uni-popup>
</template>

<script setup>
	import { ref } from 'vue'

	// 弹窗实例引用,用于控制弹窗打开/关闭
	const popup = ref(null)

	// 组件 props 定义
	const props = defineProps({
		// 弹窗高度,默认 400rpx
		height: {
			type: String,
			default: '400rpx'
		},
	})

	// 角标键盘数据(上标数字 + 上标负号)
	const charts = [
		{ id: 1, value: '¹', type: 'up' },
		{ id: 2, value: '²', type: 'up' },
		{ id: 3, value: '³', type: 'up' },
		{ id: 4, value: '⁴', type: 'up' },
		{ id: 5, value: '⁵', type: 'up' },
		{ id: 6, value: '⁶', type: 'up' },
		{ id: 7, value: '⁷', type: 'up' },
		{ id: 8, value: '⁸', type: 'up' },
		{ id: 9, value: '⁹', type: 'up' },
		{ id: 10, value: '⁰', type: 'up' },
		{ id: 11, value: '⁻', type: 'up' } // 上标负号
	]

	// 定义组件事件,用于向父组件传递输入结果
	const emit = defineEmits(['handleInput'])

	// 记录当前操作的属性(可选,用于父组件区分多个输入场景)
	const attrbuteHandle = ref('')

	/**
	 * 打开弹窗
	 * @param {String} attrbute - 可选参数,标识当前操作的输入字段
	 */
	const open = (attrbute) => {
		attrbuteHandle.value = attrbute
		popup.value.open()
	}

	/**
	 * 关闭弹窗
	 */
	const close = () => {
		popup.value.close()
	}

	/**
	 * 处理键盘点击事件
	 * @param {String} value - 选中的角标字符
	 */
	const handleInput = (value) => {
		// 向父组件发射事件,传递选中的字符和当前操作的属性
		emit('handleInput', value, attrbuteHandle.value)
	}

	// 暴露组件方法,允许父组件调用 open 和 close
	defineExpose({
		open,
		close
	})
</script>

<style scoped>
	/* 键盘容器样式:网格布局 + 背景色 + 边框圆角 */
	.keyboard-content {
		background-color: #f5f5f5;
		display: grid;
		grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; /* 6列均匀分布 */
		border: 1px solid #ccc;
		border-radius: 10rpx;
	}

	/* 键盘按钮样式:居中对齐 + 边框 + 圆角 + 间距 */
	.key-item {
		box-sizing: border-box;
		height: 70rpx;
		text-align: center;
		line-height: 70rpx;
		border: 1px solid #dcdfe6;
		border-radius: 4px;
		margin: 20rpx;
		background-color: #fff;
		transition: background-color 0.2s;
	}

	/* 按钮点击反馈 */
	.key-item:active {
		background-color: #e8f4f8;
		border-color: #409eff;
	}

	/* 辅助样式(适配 UniApp 尺寸单位) */
	.w-p-100 { width: 100%; }
	.h-p-100 { height: 100%; }
	.mt-30 { margin-top: 30rpx; }
	.pr-15 { padding-right: 15rpx; }
	.pl-15 { padding-left: 15rpx; }
	.pb-15 { padding-bottom: 15rpx; }
	.border-box { box-sizing: border-box; }
</style>

三、组件使用方法

1. 引入组件

在需要使用角标键盘的页面中引入组件:

<template>
	<view class="container">
		<!-- 示例:输入框 + 打开键盘按钮 -->
		<view class="input-group">
			<input 
				v-model="inputValue" 
				placeholder="点击下方按钮输入角标"
				class="input"
			/>
			<button @click="openSubscriptKeyboard">打开角标键盘</button>
		</view>

		<!-- 引入角标键盘组件 -->
		<subscript-keyboard 
			ref="subscriptKeyboard" 
			height="450rpx"  <!-- 自定义弹窗高度 -->
			@handleInput="handleSubscriptInput"
		/>
	</view>
</template>

<script setup>
	import { ref } from 'vue'
	// 引入组件(根据实际文件路径调整)
	import SubscriptKeyboard from '@/components/SubscriptKeyboard/SubscriptKeyboard.vue'

	const inputValue = ref('')
	const subscriptKeyboard = ref(null)

	/**
	 * 打开角标键盘
	 */
	const openSubscriptKeyboard = () => {
		// 可传递参数标识当前操作的输入字段(如多个输入框时使用)
		subscriptKeyboard.value.open('inputValue')
	}

	/**
	 * 处理角标输入回调
	 * @param {String} value - 选中的角标字符
	 * @param {String} attr - 当前操作的属性名
	 */
	const handleSubscriptInput = (value, attr) => {
		// 将选中的角标字符拼接到输入框
		inputValue.value += value
		// 如需自动关闭弹窗,可添加:subscriptKeyboard.value.close()
	}
</script>

<style scoped>
	.container {
		padding: 50rpx;
	}
	.input-group {
		margin-bottom: 30rpx;
	}
	.input {
		border: 1px solid #ccc;
		border-radius: 8rpx;
		padding: 15rpx;
		margin-bottom: 20rpx;
	}
	button {
		background-color: #409eff;
		color: #fff;
		border: none;
		border-radius: 8rpx;
		padding: 15rpx;
	}
</style>

2. 核心 API 说明

名称类型说明
heightProp(String)弹窗高度,默认 400rpx
handleInputEvent键盘点击回调,返回两个参数:value(选中的角标字符)、attr(打开弹窗时传递的属性标识)
openMethod(String)打开弹窗,参数为当前操作的属性标识(可选)
closeMethod关闭弹窗

四、组件优化与扩展建议

1. 样式优化

2. 功能扩展

示例扩展(支持上标/下标切换):

// 扩展 charts 数据
const charts = [
	// 上标数字
	{ id: 1, value: '¹', type: 'up' },
	// ... 其他上标数据
	// 下标数字
	{ id: 12, value: '₁', type: 'down' },
	// ... 其他下标数据
]

// 添加 Prop 控制显示类型
const props = defineProps({
	// ... 原有 props
	type: {
		type: String,
		default: 'up', // up-上标,down-下标
		validator: (value) => ['up', 'down'].includes(value)
	}
})

// 渲染时根据 type 过滤数据
const displayCharts = computed(() => {
	return charts.filter(item => item.type === props.type)
})

3. 性能优化

五、注意事项

  1. 组件依赖 uni-popup 组件(uni-app 内置组件),无需额外安装
  2. 角标字符为 Unicode 编码,确保项目字体支持该类字符显示(大部分现代字体均支持)
  3. 在多端运行时,需注意 uni-popup 组件的兼容性(UniApp 已做适配,无需额外处理)
  4. 如需在输入框中正确显示角标,确保输入框支持 HTML 实体或 Unicode 字符渲染(普通输入框均支持)

六、总结

本文实现的角标数字键盘弹窗组件具有轻量、易用、可扩展的特点,可快速集成到 uni-app 项目中解决角标输入需求。通过简单的扩展,还可支持更多类型的角标输入,满足不同场景的使用需求。如果在使用过程中有任何问题或优化建议,欢迎留言交流!

以上就是在uni-app项目中自定义角标数字键盘弹窗的实现方案的详细内容,更多关于uni-app自定义角标数字键盘弹窗的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文