最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在uni-app項(xiàng)目中自定義角標(biāo)數(shù)字鍵盤(pán)彈窗的實(shí)現(xiàn)方案

 更新時(shí)間:2025年11月20日 09:53:02   作者:Jiaberrr  
在 uni-app 項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)遇到需要輸入角標(biāo)數(shù)字(如下標(biāo)、上標(biāo))的場(chǎng)景(例如化學(xué)公式、數(shù)學(xué)表達(dá)式、特殊標(biāo)注等),因此本文將分享一個(gè)自定義角標(biāo)數(shù)字鍵盤(pán)彈窗的實(shí)現(xiàn)方案,需要的朋友可以參考下

在 uni-app 項(xiàng)目開(kāi)發(fā)中,經(jīng)常會(huì)遇到需要輸入角標(biāo)數(shù)字(如下標(biāo)、上標(biāo))的場(chǎng)景(例如化學(xué)公式、數(shù)學(xué)表達(dá)式、特殊標(biāo)注等)。UniApp 原生鍵盤(pán)不支持角標(biāo)數(shù)字輸入,因此本文將分享一個(gè)自定義角標(biāo)數(shù)字鍵盤(pán)彈窗的實(shí)現(xiàn)方案,支持上標(biāo)數(shù)字(1234567890)和負(fù)號(hào)(-)輸入,可直接集成到項(xiàng)目中使用。

一、組件功能說(shuō)明

  1. 支持 0-9 上標(biāo)數(shù)字(1234567890)和上標(biāo)負(fù)號(hào)(-)輸入
  2. 彈窗從底部彈出,支持自定義彈窗高度
  3. 點(diǎn)擊鍵盤(pán)按鈕觸發(fā)輸入事件,通過(guò)回調(diào)返回選中的角標(biāo)字符
  4. 支持手動(dòng)控制彈窗的打開(kāi)和關(guān)閉
  5. 適配 UniApp 多端運(yùn)行(H5、小程序、App 等)

二、完整組件代碼

<template>
	<!-- 底部彈窗容器,使用 uni-popup 實(shí)現(xiàn)彈窗基礎(chǔ)功能 -->
	<uni-popup 
		ref="popup" 
		type="bottom" 
		background-color="#fff" 
		borderRadius="60rpx 60rpx 0 0"
	>
		<!-- 鍵盤(pán)容器,支持自定義高度和內(nèi)邊距 -->
		<view 
			class="w-p-100 mt-30 pr-15 pl-15 pb-15 border-box overflow-y" 
			:style="{height:height}"
		>
			<!-- 鍵盤(pán)按鈕區(qū)域,使用 grid 布局實(shí)現(xiàn)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'

	// 彈窗實(shí)例引用,用于控制彈窗打開(kāi)/關(guān)閉
	const popup = ref(null)

	// 組件 props 定義
	const props = defineProps({
		// 彈窗高度,默認(rèn) 400rpx
		height: {
			type: String,
			default: '400rpx'
		},
	})

	// 角標(biāo)鍵盤(pán)數(shù)據(jù)(上標(biāo)數(shù)字 + 上標(biāo)負(fù)號(hào))
	const charts = [
		{ id: 1, value: '1', type: 'up' },
		{ id: 2, value: '2', type: 'up' },
		{ id: 3, value: '3', 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' } // 上標(biāo)負(fù)號(hào)
	]

	// 定義組件事件,用于向父組件傳遞輸入結(jié)果
	const emit = defineEmits(['handleInput'])

	// 記錄當(dāng)前操作的屬性(可選,用于父組件區(qū)分多個(gè)輸入場(chǎng)景)
	const attrbuteHandle = ref('')

	/**
	 * 打開(kāi)彈窗
	 * @param {String} attrbute - 可選參數(shù),標(biāo)識(shí)當(dāng)前操作的輸入字段
	 */
	const open = (attrbute) => {
		attrbuteHandle.value = attrbute
		popup.value.open()
	}

	/**
	 * 關(guān)閉彈窗
	 */
	const close = () => {
		popup.value.close()
	}

	/**
	 * 處理鍵盤(pán)點(diǎn)擊事件
	 * @param {String} value - 選中的角標(biāo)字符
	 */
	const handleInput = (value) => {
		// 向父組件發(fā)射事件,傳遞選中的字符和當(dāng)前操作的屬性
		emit('handleInput', value, attrbuteHandle.value)
	}

	// 暴露組件方法,允許父組件調(diào)用 open 和 close
	defineExpose({
		open,
		close
	})
</script>

<style scoped>
	/* 鍵盤(pán)容器樣式:網(wǎng)格布局 + 背景色 + 邊框圓角 */
	.keyboard-content {
		background-color: #f5f5f5;
		display: grid;
		grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr; /* 6列均勻分布 */
		border: 1px solid #ccc;
		border-radius: 10rpx;
	}

	/* 鍵盤(pán)按鈕樣式:居中對(duì)齊 + 邊框 + 圓角 + 間距 */
	.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;
	}

	/* 按鈕點(diǎn)擊反饋 */
	.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. 引入組件

在需要使用角標(biāo)鍵盤(pán)的頁(yè)面中引入組件:

<template>
	<view class="container">
		<!-- 示例:輸入框 + 打開(kāi)鍵盤(pán)按鈕 -->
		<view class="input-group">
			<input 
				v-model="inputValue" 
				placeholder="點(diǎn)擊下方按鈕輸入角標(biāo)"
				class="input"
			/>
			<button @click="openSubscriptKeyboard">打開(kāi)角標(biāo)鍵盤(pán)</button>
		</view>

		<!-- 引入角標(biāo)鍵盤(pán)組件 -->
		<subscript-keyboard 
			ref="subscriptKeyboard" 
			height="450rpx"  <!-- 自定義彈窗高度 -->
			@handleInput="handleSubscriptInput"
		/>
	</view>
</template>

<script setup>
	import { ref } from 'vue'
	// 引入組件(根據(jù)實(shí)際文件路徑調(diào)整)
	import SubscriptKeyboard from '@/components/SubscriptKeyboard/SubscriptKeyboard.vue'

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

	/**
	 * 打開(kāi)角標(biāo)鍵盤(pán)
	 */
	const openSubscriptKeyboard = () => {
		// 可傳遞參數(shù)標(biāo)識(shí)當(dāng)前操作的輸入字段(如多個(gè)輸入框時(shí)使用)
		subscriptKeyboard.value.open('inputValue')
	}

	/**
	 * 處理角標(biāo)輸入回調(diào)
	 * @param {String} value - 選中的角標(biāo)字符
	 * @param {String} attr - 當(dāng)前操作的屬性名
	 */
	const handleSubscriptInput = (value, attr) => {
		// 將選中的角標(biāo)字符拼接到輸入框
		inputValue.value += value
		// 如需自動(dòng)關(guān)閉彈窗,可添加: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 說(shuō)明

名稱類型說(shuō)明
heightProp(String)彈窗高度,默認(rèn) 400rpx
handleInputEvent鍵盤(pán)點(diǎn)擊回調(diào),返回兩個(gè)參數(shù):value(選中的角標(biāo)字符)、attr(打開(kāi)彈窗時(shí)傳遞的屬性標(biāo)識(shí))
openMethod(String)打開(kāi)彈窗,參數(shù)為當(dāng)前操作的屬性標(biāo)識(shí)(可選)
closeMethod關(guān)閉彈窗

四、組件優(yōu)化與擴(kuò)展建議

1. 樣式優(yōu)化

  • 可根據(jù)項(xiàng)目設(shè)計(jì)風(fēng)格修改按鈕顏色、圓角、間距等樣式
  • 增加按鈕禁用狀態(tài)(如需)
  • 適配深色模式,可通過(guò) CSS 變量動(dòng)態(tài)切換樣式

2. 功能擴(kuò)展

  • 支持下標(biāo)數(shù)字:在 charts 數(shù)組中添加下標(biāo)數(shù)字(???????????),并通過(guò) type 區(qū)分上標(biāo)/下標(biāo),在父組件中控制顯示類型
  • 添加刪除鍵:增加刪除按鈕,點(diǎn)擊時(shí)刪除最后一個(gè)輸入的角標(biāo)字符
  • 支持字母角標(biāo):擴(kuò)展 charts 數(shù)據(jù),添加上標(biāo)/下標(biāo)字母(如 ???、??? 等)
  • 自定義角標(biāo)集合:通過(guò) Prop 傳遞自定義角標(biāo)數(shù)據(jù),使組件更靈活

示例擴(kuò)展(支持上標(biāo)/下標(biāo)切換):

// 擴(kuò)展 charts 數(shù)據(jù)
const charts = [
	// 上標(biāo)數(shù)字
	{ id: 1, value: '1', type: 'up' },
	// ... 其他上標(biāo)數(shù)據(jù)
	// 下標(biāo)數(shù)字
	{ id: 12, value: '?', type: 'down' },
	// ... 其他下標(biāo)數(shù)據(jù)
]

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

// 渲染時(shí)根據(jù) type 過(guò)濾數(shù)據(jù)
const displayCharts = computed(() => {
	return charts.filter(item => item.type === props.type)
})

3. 性能優(yōu)化

  • 對(duì) charts 數(shù)據(jù)進(jìn)行靜態(tài)化處理,避免重復(fù)創(chuàng)建
  • 增加彈窗打開(kāi)/關(guān)閉的動(dòng)畫(huà)效果(可通過(guò) uni-popupanimation 屬性配置)
  • 優(yōu)化觸摸反饋,避免快速點(diǎn)擊導(dǎo)致的重復(fù)觸發(fā)

五、注意事項(xiàng)

  1. 組件依賴 uni-popup 組件(uni-app 內(nèi)置組件),無(wú)需額外安裝
  2. 角標(biāo)字符為 Unicode 編碼,確保項(xiàng)目字體支持該類字符顯示(大部分現(xiàn)代字體均支持)
  3. 在多端運(yùn)行時(shí),需注意 uni-popup 組件的兼容性(UniApp 已做適配,無(wú)需額外處理)
  4. 如需在輸入框中正確顯示角標(biāo),確保輸入框支持 HTML 實(shí)體或 Unicode 字符渲染(普通輸入框均支持)

六、總結(jié)

本文實(shí)現(xiàn)的角標(biāo)數(shù)字鍵盤(pán)彈窗組件具有輕量、易用、可擴(kuò)展的特點(diǎn),可快速集成到 uni-app 項(xiàng)目中解決角標(biāo)輸入需求。通過(guò)簡(jiǎn)單的擴(kuò)展,還可支持更多類型的角標(biāo)輸入,滿足不同場(chǎng)景的使用需求。如果在使用過(guò)程中有任何問(wèn)題或優(yōu)化建議,歡迎留言交流!

以上就是在uni-app項(xiàng)目中自定義角標(biāo)數(shù)字鍵盤(pán)彈窗的實(shí)現(xiàn)方案的詳細(xì)內(nèi)容,更多關(guān)于uni-app自定義角標(biāo)數(shù)字鍵盤(pán)彈窗的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

郁南县| 谷城县| 鸡西市| 广南县| 陕西省| 辽源市| 遵义市| 瑞安市| 忻城县| 英超| 佛山市| 嫩江县| 海晏县| 阿坝县| 邢台县| 龙岩市| 泸州市| 桂阳县| 儋州市| 资中县| 恩施市| 宝丰县| 望城县| 安福县| 上思县| 云浮市| 新化县| 望江县| 夏河县| 仁布县| 龙山县| 溧水县| 白银市| 安阳市| 观塘区| 新乡市| 满洲里市| 湖口县| 定州市| 临洮县| 信阳市|