uniapp + vue3微信小程序开发(8)input保留两位小数

该博客详细介绍了在uniapp开发过程中遇到的input输入框无法修改值的bug以及如何解决。同时,作者提出了一个保留两位小数的解决方案,通过设置maxLength限制长度,确保输入金额始终带有两位小数。在输入框失焦后进行校验,若输入值超过9999或不符合格式,会进行相应提示和修正。此外,提供了完整的代码示例展示实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入框的开发,算是非常常用的了,我们使用uniapp开发输入框的话,会有那么几个bug,由uniapp缺陷导致。

1、uniapp input缺陷

1.1、每次input框输入都无法修改值

解决方法:

<input type="digit" @input="inputInput" :value="amount"/>

<script setup>
    const inputInput= (e) => {
        amount.value = ''
        setTimeout(() => {
            amount.value = e.detail.value
        })
    }
</script>

2、如何保留两位小数

网上大多数博客都说的正则限制,但是我觉得不行也不好,我提出的方法是maxLength限制长度,思路为判断整数位数,那么 maxLength = 整数位数 + 3 (这个3 包括小数点长度1和两位小数长度)

我是在input 失焦后触发方法,思路如下:

valitMoney是我验证是否通过的标志,你可以根据自己代码需要来决定是否用,然后我这个输入框要保证的效果就是:值不能超过9999,然后不管输入的啥,最后都要有两位小数,例:888 => 888.00, 99.1 => 99.10, 0 => 0.00 

截图:

代码:

    <view class="amount">
				<view class="input-suffix">
					¥
				</view>
				<input class="input-account" type="digit" :value="amount" :disabled="payStatus" :maxlength="maxlength"  @input="inputInput" @focus="inputFocus" @blur="inputBlur" placeholder-class="input-placeholder"/>
			</view>

<script setup>
    /**
	 * 输入框失焦后触发
	 */
	const inputBlur = (e) => {
		amount.value = ''
		setTimeout(() => {
			if (e.detail.value !== '') {
				if (Number(e.detail.value) > 9999) {
					uni.showToast({
						title: '数额太大,请修改',
						icon: 'none'
					})
					amount.value = ''
					return
				}
				let flag = e.detail.value.indexOf(".")
				// 整数,没有小数
				if (flag === -1) {
					let bigLen = e.detail.value.length // 整数位数
					if (bigLen > 4) {
						amount.value = e.detail.value + '.00'
						maxlength.value = 7
					} else {
						maxlength.value = bigLen + 1 + 2
						amount.value = e.detail.value + '.00'
					}
				// 有小数
				} else {
					let bigLen = e.detail.value.split('.')[0].length // 整数位数
					let smallLen = e.detail.value.split('.')[1].length // 小数位数
					if (smallLen === 0) {
						amount.value = e.detail.value + '00'
					} else if (smallLen === 1) {
						amount.value = e.detail.value + '0'
					} else if (smallLen === 2) {
						amount.value = e.detail.value
					}
					maxlength.value = bigLen + 1 + 2
				}
				valitMoney.value = true
			} else {
				amount.value = ''
				valitMoney.value = false
			}	
		})
		
	}
</script>
<style lang="scss" scoped>
            .amount {
				margin-top: 30rpx;
				display: flex;
				flex-flow: row nowrap;
				align-items: center;
				width: 690rpx;
				height: 89rpx;
				box-sizing: border-box;
				border: 1px solid #F56C6C;
				background-color: #FEF0F0;
				font-size: 46rpx;
				font-weight: bold;
				color: #CA2915;
				line-height: 89rpx;
				.input-suffix{
					flex: 0 1 45%;
					text-align: right;
				}
				.input-account{
					flex: 0 1 55%;
					border-radius: 10rpx;
					text-align: left;
					position: relative;
				}
			}
</style>

<think>好的,我现在需要帮助用户解决如何用JavaScript实现点击按钮后获取输入框的值并进行处理的问题。首先,我需要理解用户的具体需求。用户提到想通过点击操作将输入框的数据传递回JavaScript处理,可能涉及到表单提交或按钮点击事件。 首先,我应该回忆一下JavaScript中获取输入框值的基本方法。通常,可以通过document.getElementById或querySelector来获取输入框元素,然后访问其value属性。记得处理可能的空值或无效输入,比如用户没有填写内容就点击按钮的情况。 接下来,用户可能需要将获取的值进行处理,比如验证、计算或发送到服务器。这时候需要给按钮添加点击事件监听器,当点击时触发处理函数。在函数内部,获取输入框的值,然后执行相应的操作。 还要考虑用户是否使用Vue等框架,但根据问题描述,用户要求用纯JavaScript实现,所以需要避免框架特定的方法。不过,用户提供的引用中有一些Vue相关的例子,比如引用1和3,但用户现在需要的是原生JavaScript的方法,所以应该专注于基础实现。 另外,需要确保代码示例的正确性,比如正确绑定事件监听器,防止默认表单提交行为,或者处理输入框为空时的提示,如引用2中提到的表单验证。例如,使用check()函数返回false来阻止表单提交,或者用alert提示用户输入。 可能还需要考虑不同的输入框类型,比如文本框、单选按钮、复选框等,但用户的问题主要针对输入框,所以可以专注于文本输入框的处理。不过,引用4提到微信小程序中的动态添加输入框和步进器,这可能涉及到更复杂的逻辑,但用户的问题更基础,可能不需要涉及动态添加元素,除非用户有隐含的需求。 然后,我需要整理步骤,先获取DOM元素,再绑定事件,处理数据,最后给出示例代码。同时,要提醒用户注意的事项,比如确保DOM加载完成后执行脚本,防止获取不到元素;输入验证的重要性;以及事件监听的正确绑定方法,比如使用addEventListener而不是内联事件属性。 最后,生成相关问题,帮助用户进一步学习,比如如何防止表单自动提交、处理多个输入框、数据验证的方法等。这些问题应该与当前主题相关,并参考用户提供的引用中的内容,如引用2中的表单验证,引用4中的动态添加输入框等。 总结一下,回答的结构应该是:步骤说明,代码示例,注意事项,相关问题。确保使用正确的中文表达,不使用Markdown,代码用三个反引号包裹,并正确引用用户提供的参考资料中的相关内容,比如表单验证部分引用[^2],动态处理引用[^4]等。</think>要实现点击按钮获取输入框值并进行处理,可以通过以下步骤实现: ### 一、基础实现步骤 1. **获取DOM元素** ```javascript // 获取输入框元素 const inputElement = document.getElementById(&#39;myInput&#39;); // 获取按钮元素 const btnElement = document.getElementById(&#39;myBtn&#39;); ``` 2. **绑定点击事件** ```javascript btnElement.addEventListener(&#39;click&#39;, function() { // 获取输入框的值(自动去除首尾空格) const inputValue = inputElement.value.trim(); // 输入验证 if (!inputValue) { alert(&#39;输入不能为空&#39;); // 参考验证逻辑 return; } // 数据处理示例:转数字运算 const numberValue = parseFloat(inputValue); console.log(&#39;处理后的数值:&#39;, numberValue * 2); }); ``` ### 二、完整示例 ```html <input type="text" id="priceInput" placeholder="输入价格"> <button id="calculateBtn">计算税费</button> <script> document.getElementById(&#39;calculateBtn&#39;).addEventListener(&#39;click&#39;, () => { const input = document.getElementById(&#39;priceInput&#39;); const value = parseFloat(input.value.trim()); if (isNaN(value)) { alert(&#39;请输入有效数字&#39;); // 输入验证[^2] input.focus(); // 自动聚焦[^1] return; } // 计算含税价格(假设税率10%) const tax = value * 0.1; alert(`含税总价:${value + tax}元`); }); </script> ``` ### 三、关键注意事项 1. **DOM加载时序** 需确保脚本在DOM加载后执行,推荐将`<script>`标签放在`</body>`前或使用`DOMContentLoaded`事件: ```javascript document.addEventListener(&#39;DOMContentLoaded&#39;, () => { // 初始化代码 }); ``` 2. **输入验证增强** 可结合正则表达式进行格式验证: ```javascript if (!/^\d+(\.\d{1,2})?$/.test(inputValue)) { alert(&#39;请输入有效金额(最多两位小数)&#39;); } ``` 3. **动态元素处理** 若输入框是动态生成的(参考动态组件处理[^4]),需使用事件委托: ```javascript document.body.addEventListener(&#39;click&#39;, function(e) { if (e.target.classList.contains(&#39;dynamic-btn&#39;)) { // 处理动态按钮逻辑 } }); ``` ### 四、扩展应用场景 1. **表单批量处理** 获取多个输入框值时,可使用`querySelectorAll`: ```javascript document.querySelectorAll(&#39;.item-input&#39;).forEach(input => { console.log(input.value); }); ``` 2. **即时数据绑定** 通过`input`事件实现实时响应(类似Vue的双向绑定[^3]): ```javascript inputElement.addEventListener(&#39;input&#39;, (e) => { console.log(&#39;实时值:&#39;, e.target.value); }); ``` [^1]: 自动聚焦实现参考 : 输入验证逻辑规范 [^4]: 动态元素处理方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值