React 中的 onInput/onChange
DOM 的oninput和onchange
oninput在输入内容的时候,持续调用,通过element.value可以持续取值,失去焦点和获取焦点不会被调用。
onchange在输入期间不会被调用,在失去焦点且失去焦点时的value与获得焦点时的value不一致(输入内容有变化)的时候才会被调用。
如果需要检测用户一个输入框的内容是否有变化,onchange就能很好地处理这种情况。
<body>
<input type="text" id="myInput" oninput="myinput()" />
<input type="text" id="change" onchange="mychange()" />
</body>
<script>
function myinput() {
var x = document.getElementById("myInput").value;
console.info("input", x);
}
function mychange() {
var x = document.getElementById("change").value;
console.info("change", x);
}
</script>
React 中的onInput和onChange
React 的onInput和onChange并没有多少区别,其作用都是在用户持续输入的时候触发,不在失去获取或者失去焦点的时候触发。
要获取焦点相关的事件需要通过onFocus和onBlur。而需要检测用户输入的内容是否有变化则需要手动去取值对比,没有原生的onChange那样便捷。
export default function InputChange() {
function input(e) {
console.info("input", e.target.value);
}
function change(e) {
console.info("change", e.target.value);
}
return (
<div style={{ display: "flex", flexDirection: "column" }}>
<input onFocus onBlur onInput={input}></input>
<input onChange={change}></input>
</div>
);
}
查看对应的参数的TypeScript类型:
<input onInput={(evt: React.FormEvent<HTMLInputElement>) => {}}></input>
<input onChange={(evt: React.ChangeEvent<HTMLInputElement>) => {}}></input>
onInput的参数是React.FormEvent<HTMLInputElement>,而onChange是React.ChangeEvent<HTMLInputElement>,已经区分开了表单Form事件和Change事件。
onChange对应的多个target,猜测是因为onChange可以用在其他的元素上,传入的泛型不一定是HTMLInputElement,如select
select的onchange事件:((event: React.ChangeEvent) => void) | undefined
interface FormEvent<T = Element> extends SyntheticEvent<T> {}
interface ChangeEvent<T = Element> extends SyntheticEvent<T> {
target: EventTarget & T;
}
继续往下查看SyntheticEvent:
interface SyntheticEvent<T = Element, E = Event> extends BaseSyntheticEvent<E, EventTarget & T, EventTarget> {}
继续看BaseSyntheticEvent:
interface BaseSyntheticEvent<E = object, C = any, T = any> {
nativeEvent: E;
currentTarget: C;
target: T;
bubbles: boolean;
cancelable: boolean;
defaultPrevented: boolean;
eventPhase: number;
isTrusted: boolean;
preventDefault(): void;
isDefaultPrevented(): boolean;
stopPropagation(): void;
isPropagationStopped(): boolean;
persist(): void;
timeStamp: number;
type: string;
}
这里就是React合成事件的基础interface了,也含有target,阻止事件冒泡的stopPropagation和阻止默认行为的preventDefault都在这里了。从TS层面能看出的就是onInput和onChange基于的事件不一样(React.FormEvent和React.ChangeEvent),而onChange事件可用于不同的元素中,target也可能是不同的元素对象。
React 中的 onInput/onChange的更多相关文章
- React中的合成事件
React中的合成事件 React自己实现了一套高效的事件注册.存储.分发和重用逻辑,在DOM事件体系基础上做了很大改进,减少了内存消耗,简化了事件逻辑,并最大程度地解决了IE等浏览器的不兼容问题. ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
- react中键盘enter事件处理
对于常见的搜索需求业务场景,用户输入完成后,点击enter事件请求数据,要求不提交页面,实现数据局部更新,这需要用到react中的表单Forms. 处理方法: (1)html书写 form标签中去掉a ...
- react中这些细节你注意过没有?
react中的一些细节知识点: 1.组件中get的使用(作为类的getter) ES6知识:class类也有自己的getter和setter,写法如下: Class Component { const ...
- React中props与state
以下内容均为个人理解. 1.state: 在react中,state可以看成管理页面状态的集合(实则一个对象而已),库里面的成员均为页面渲染变量,整个页面为一个状态机,当state发生变化时,页面会重 ...
- React中的响应式设计思想和事件绑定
这两个点是react入门非常重要的两个点,以前我们是直接操作dom的形式去做,react的设计思想和以前直接操作dom是完全不同的,react是一个响应式的框架,他在做编程的时候,强调的是我们不要直接 ...
- React中最基础的jsx语法
import React, { Component } from 'react'; class App extends Component { render() { return ( <div ...
- react中事件冒泡之填坑
今天在写个组件,大致代码是这样的: class Switch extends React.Component { handlerChange = (e) => { const {onChange ...
- React中input框设置value报错解析
react input 不设置onChange的常见错误截图 表单是前端非常重要的一块内容,并且往往包含了错误校验等逻辑. React对表单元素做了专门的优化处理,他对表单元素做了一些抽象,使得他们 ...
随机推荐
- HDU 6762 Mow (2020 Multi-University Training Contest 1 1012) 半平面交
Mow 题目链接 分析 将多边形的边向内部缩 r 个单位长度,然后这些边所围成的内部区域,就是圆心的合法范围,该范围也是一个多边形,假设面积是\(a\),周长是\(b\),那么可以知道圆可以覆盖的面积 ...
- 1569: Wet Tiles
Description Alice owns a construction company in the town of Norainia, famous for its unusually dry ...
- 用servlet在网页中打印字符串(初接触)、servlet调用过程
一.servlet是什么: 二.在官方文档中点servlet 这就是servlet的方法,这里说一下什么叫生命周期的方法(life-cycle methods):就是这个对象一旦创生之后一定会执行的方 ...
- 洛谷 P6851 onu (贪心,模拟)
题意:C和D打牌,每张牌有花色和点数,小D刚开始的分数为\(v\),不管输还是赢,只要小D出了牌(花色必须相同),就能得到那张牌点数的分数,若是赢了(点数不小于D的牌),他可以另外加\(c\)分,输了 ...
- 6.PowerShell DSC核心概念之LCM
什么是LCM? 本地配置管理器 (LCM) 是DSC的引擎. LCM 在每个目标节点上运行,负责分析和执行发送到节点的配置. 它还负责 DSC 的许多方面,包括以下各方面. 确定刷新模式(推送或请求) ...
- Shell 编程练习
将后缀名为 .txt 的文件改成 .log [root@k8s-master test]# touch localhost_2020-01-{02..26}.txt [root@k8s-master ...
- 微信小程序开发抖音去水印功能
之前找了很多抖音去水印的工具全是广告,所以索性自己写了一个,提供给大家免费试用以下是微信小程序的二维码 使用教程: 1.打开微信搜索小程序:沸点软件技术服务 2.打开沸点软件技术服务小程序 3.去抖音 ...
- 二分类问题中混淆矩阵、PR以及AP评估指标
仿照上篇博文对于混淆矩阵.ROC和AUC指标的探讨,本文简要讨论机器学习二分类问题中的混淆矩阵.PR以及AP评估指标:实际上,(ROC,AUC)与(PR,AP)指标对具有某种相似性. 按照循序渐进的原 ...
- Object & prototype & __proto__ All In One
Object & prototype & proto All In One js 原型,原型链,原型对象 const obj ={}; // {} const obj = new Ob ...
- GitHub rename the default branch from master to main
GitHub rename the default branch from master to main master => main Repository default branch Cho ...