【发布时间】:2022-01-29 19:46:23
【问题描述】:
在 javascript 中,input 具有 change 事件,当输入失去焦点或用户使用升压或降压功能时发生type="number" 事件,但不是在正常输入时发生。
document.querySelector("input").addEventListener("change", e => {
console.log(e.type, e.target.value)
})
<input type="number" step="0.01"> <button>&nbsp;</button>
但是当我使用 react 时,它会将 change 事件替换为 input 事件,该事件也发生在打字时:
function App() {
const [val, setVal] = React.useState("")
function onChange(e) {
console.log(e.type, e.nativeEvent.type, e.target.value)
setVal(e.target.value)
}
return <input type="number" step="0.01" value={val} onChange={onChange} />
}
ReactDOM.render(<App />, document.getElementById("app"))
<script crossorigin src="//unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="//unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<span id="app"></span> <button> </button>
我需要处理打字时不会发生的正常change 事件。
我该怎么做?
PS:片段中的按钮是一个可以tab从input跳转到的地方。
是的,“当键入时会导致编辑值出现问题”部分确实有点帮助,尽管这对我来说似乎是代码异味,可能是 XY 问题。您能否分享在以正常 React 方式使用
onChange时,输入输入是如何导致问题的?
我不想完全拒绝使用它,我只想同时使用它。
这是一个有问题的例子:
- 您不能在小数部分使用退格(除非您输入了超过 2 个十进制数字)
- 如果在小数部分使用delete,则加零,光标跳到末尾
- 如果当前值为数字,例如
1.<cursor>20,并且您输入数字,光标将跳到末尾 - 如果当前值类似于
<cursor>1000.00,然后按删除,数字变为0.00 - 如果您尝试在空输入中写入,则在按下第一个数字后会变成
7.00<cursor>,并且很难输入类似 7.23 的内容 - 我很难从输入中删除所有值,因为它变成了
0.00,直到你全部选择它 - 我认为,还有更多问题
function App() {
const [val, setVal] = React.useState("")
function onChange(e) {
console.log(e.type, e.nativeEvent.type, e.target.value)
setVal(e.target.value == +e.target.valueAsNumber.toFixed(2)
? e.target.valueAsNumber.toFixed(2)
: e.target.value
)
}
return <input type="number" step="0.01" value={val} onChange={onChange} />
}
ReactDOM.render(<App />, document.getElementById("app"))
<script crossorigin src="//unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="//unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<span id="app"></span> <button> </button>
如果我尝试使用onBlur fpr 格式,它会变得更好,但是:
- 当您单击 step up 或 step down 按钮或按 up 或 down 时,数字未格式化在具有相同效果的键盘上:
function App() {
const [val, setVal] = React.useState("")
function onChange(e) {
console.log(e.type, e.nativeEvent.type, e.target.value)
setVal(e.target.value)
}
function onBlur(e) {
console.log(e.type, e.nativeEvent.type, e.target.value)
if (e.target.value && e.target.value == +e.target.valueAsNumber.toFixed(2)) {
setVal(e.target.valueAsNumber.toFixed(2))
}
}
return <input type="number" step="0.01" value={val} onChange={onChange} onBlur={onBlur} />
}
ReactDOM.render(<App />, document.getElementById("app"))
<script crossorigin src="//unpkg.com/react@17/umd/react.production.min.js"></script>
<script crossorigin src="//unpkg.com/react-dom@17/umd/react-dom.production.min.js"></script>
<span id="app"></span> <button> </button>
所以我想使用出现在模糊和台阶上的change。
【问题讨论】:
-
onChange在 React 中的工作方式与在 vanilla JS 中的工作方式不同。您可以使用onBlur事件并通过 React ref 获取输入的值。有没有令人信服的理由不只使用onChange处理程序?你可能会发现这个post 很有帮助。 -
@DrewReese,
onBlur不会出现在上台阶下。 FF eve 允许在不从另一个控件移动焦点的情况下单击它们。 -
诚然,我 99.9% 的 JS 经验都在 React 中,所以 React 的
onChange是“正常”行为。也许如果你描述了你想要完成的事情,或者明确地描述了你想要的行为,那么你想要在 React 中做什么可能会更清楚。仅使用onChange处理程序是否存在问题/问题? -
@DrewReese,似乎我已经描述得足够准确:函数应该在模糊或向上/向下时调用,而不是在打字时调用。如果你想知道这个功能,那就是:
if (e.target.value && !isNaN(e.target.valueAsNumber)) e.target.value = e.target.valueAsNumber .toFixed(2)。键入时不需要调用它,因为它会导致编辑值出现问题。对你有帮助吗? -
是的,“当键入时会导致编辑值出现问题”部分确实有点帮助,尽管这对我来说似乎是代码异味,可能是 XY 问题。您能否分享在以正常 React 方式使用
onChange时输入输入会导致问题的原因?
标签: javascript reactjs dom-events onchange