考虑一个带有文本输入的简单 Vue 组件(链接)。
<script setup>
import { ref } from 'vue'
const msg = ref('')
function onInput(e) {
let value = e.target.value;
if (value === ' ') value = '';
msg.value = value;
}
</script>
<template>
<input :value="msg" @input="onInput" />
</template>
我想禁用此输入中的第一个空格,即如果用户输入空格,则输入字段应保持为空。但不起作用。我猜这是因为 Vue 检查了msg
没有变化并拒绝了组件渲染。
我的下一次尝试是强制渲染组件(链接)。
<script setup>
import {getCurrentInstance} from 'vue'
import { ref } from 'vue'
const msg = ref('')
const instance = getCurrentInstance();
function onInput(e) {
let value = e.target.value;
if (value === ' ') {
value = '';
msg.value = value;
instance?.proxy?.$forceUpdate();
return;
}
msg.value = value;
}
</script>
<template>
<input :value="msg" @input="onInput" />
</template>
它可以工作,但有限制。我的项目有一个很大的组件树,并且$forceUpdate
只更新当前组件,没有子组件。
key
我也尝试通过改变组件来重新渲染整个子三,但在这种情况下我失去了输入的焦点。
总而言之,我似乎错过了一些东西。我不敢相信如此简单的任务需要奇怪的解决方法。请帮我找到一种简单且“最佳实践”的方法来禁用 html 输入中的第一个空格。
PS React 版本按预期工作。
import React, {useState} from 'react';
export function App(props) {
const [value, setValue] = useState('');
function onInput(e) {
let v = e.target.value;
if (v === ' ') v = '';
setValue(v);
}
return (
<div className='App'>
<input value={value} onInput={onInput} />
</div>
);
}
您可以处理 @keydown 事件来检测第一个输入的符号是否为空格,如果是则阻止输入。以下是示例:
根据您的代码:不要对输入事件做出反应。太晚了。在输入事件发生之前做出反应。并过滤掉那个空格字符。
这将为应用程序节省很多不必要的计算(msg=" ",然后 msg="")。
您应该使用正则表达式从字符串中删除第一个空格字符。