vue3+ts+elePlus 解决el-input-number可以输入+或者-的解决方法

文章讲述了在Vue项目中遇到el-input-number组件可以输入非法组合如10+或-10+,导致value变为null的bug。解决方案是通过监听keydown事件,阻止输入e,+,-字符。进一步将这个功能封装成自定义指令TimiKeydown,并在main.ts中全局注册,确保输入的合法性。对于更复杂的情况,如中文状态下的e输入和特定格式的数字要求,可以使用正则表达式进行校验。
摘要由CSDN通过智能技术生成

在项目开发中发现el-input-number可以输入10+或者-10+这样的奇怪组合导致提交时value变成了null

 

解决办法使用keydown。

<template>
  <el-input-number v-model="num" :min="1" :max="10" 
@change="handleChange" 	@keydown="onKeydown" />
</template>

<script lang="ts" setup>
import { ref } from 'vue'

const num = ref(1)
const handleChange = (value: number) => {
  console.log(value)
}
const onKeydown = (e)=>{
			 	 // 输入框中禁止输入e、+、-
            	let key = e.key;
            	if (key === 'e' || key === 'E' || key === '+' || key === '-') {
                	e.returnValue = false;
            	} else {
                	e.returnValue = true;
            	}
			}

</script>

 进阶用法变成自定义指令

在utils的文件夹中先建一个TiMiInputNumber.ts文件

import { Directive } from 'vue';

export const TimiKeydown: Directive = {
    mounted(el, binding) {
        function handleKeydown(e: KeyboardEvent) {
            // 输入框中禁止输入e、+、-
            let key = e.key;
            if (key === 'e' || key === 'E' || key === '+' || key === '-') {
                e.preventDefault();
            }
        }
        el.addEventListener('keydown', handleKeydown);
    },
    // unmounted(el) {
    //     el.removeEventListener('keydown', handleKeydown);
    // }
};

在main.ts中全局注册引用


import { createApp } from 'vue';
import App from './App.vue';

import { TimiKeydown } from './utils/TiMiInputNumber.ts';

const app = createApp(App);

app.directive('timi-keydown', TimiKeydown);

app.mount('#app');

场景使用 加入v-timi-keydown

            <el-input-number
                        v-model="form.n_Sort"
                        class="mx-4"
                        :min="1"
                        v-timi-keydown
                        controls-position="right"
                      
                    />

后记:根据大家的反应情况,中文状态下的e仍然可以输入提供正则方法(数据可以为正负数且可以带小数点后四位)

              <el-input placeholder="数字" v-model="input1"  style="width:130px" class="tree-map-inputnum"  
oninput="value=value.replace(/^([0-9-]\d*\.?\d{0,4})?.*$/,'$1')">
                <template slot="append">%</template>
              </el-input>//默认值input1为0

好的,下面是关于vue3+ts+elementplus聊天界面的开发方案: 1. 安装Vue CLI并创建Vue3项目 首先,您需要安装Vue CLI来创建Vue3项目。您可以使用以下命令安装Vue CLI: ``` npm install -g @vue/cli ``` 安装完成后,您可以使用以下命令创建Vue3项目: ``` vue create my-project ``` 2. 安装Element Plus Element Plus是一套基于Vue3的组件库,适用于PC端和移动端。您可以使用以下命令安装Element Plus: ``` npm install element-plus --save ``` 3. 集成TypeScript Vue3已经默认支持TypeScript,您可以使用以下命令安装TypeScript: ``` npm install typescript --save-dev ``` 4. 开始开发聊天界面 在开发聊天界面之前,您需要先确定聊天数据的结构。您可以使用以下数据结构: ``` interface Message { id: number; content: string; sender: string; receiver: string; time: string; } ``` 接下来,您可以使用Element Plus中的组件来构建聊天界面。以下是一个简单的聊天界面示例: ``` <template> <div class="chat-window"> <div class="chat-history"> <div v-for="message in messages" :key="message.id" class="message-row"> <div class="message-sender">{{ message.sender }}</div> <div class="message-content">{{ message.content }}</div> <div class="message-time">{{ message.time }}</div> </div> </div> <div class="chat-input"> <el-input v-model="inputMessage" placeholder="请输入消息"></el-input> <el-button @click="sendMessage">发送</el-button> </div> </div> </template> <script lang="ts"> import { defineComponent, ref } from 'vue'; interface Message { id: number; content: string; sender: string; receiver: string; time: string; } export default defineComponent({ name: 'ChatWindow', setup() { const messages = ref<Message[]>([ { id: 1, content: '你好', sender: '小明', receiver: '小红', time: '2022-01-01 12:00:00', }, { id: 2, content: '你好,很高兴认识你', sender: '小红', receiver: '小明', time: '2022-01-01 12:01:00', }, ]); const inputMessage = ref(''); const sendMessage = () => { const newMessage: Message = { id: messages.value.length + 1, content: inputMessage.value, sender: '小明', receiver: '小红', time: new Date().toLocaleString(), }; messages.value.push(newMessage); inputMessage.value = ''; }; return { messages, inputMessage, sendMessage, }; }, }); </script> <style> .chat-window { display: flex; flex-direction: column; width: 500px; height: 500px; border: 1px solid #ccc; overflow: hidden; } .chat-history { flex: 1; padding: 10px; overflow-y: auto; } .message-row { display: flex; flex-direction: column; margin-bottom: 10px; } .message-sender { font-weight: bold; margin-bottom: 5px; } .message-content { margin-bottom: 5px; } .message-time { font-size: 12px; color: #999; } .chat-input { display: flex; padding: 10px; background-color: #f0f0f0; } .el-input { flex: 1; margin-right: 10px; } .el-button { width: 80px; } </style> ``` 以上示例中,我们使用了Element Plus中的Input和Button组件来实现发送消息的功能,使用了Vue3中的Composition API来管理组件状态。 希望这个开发方案对您有所帮助!
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值