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 1576】A/B(数论--拓展欧几里德 求逆元 模版题)
题意:给出 A%9973 和 B,求(A/B)%9973的值. 解法:拓展欧几里德求逆元.由于同余的性质只有在 * 和 + 的情况下一直成立,我们要把 /B 转化为 *B-1,也就是求逆元. 对于 B ...
- 2019牛客暑期多校训练营(第三场)B题、H题
传送门 题意: 就是说给你一个由0或1组成的字符串,让你找出来一个0的数量和1的数量相等的最长子字符串和最长子序列 题解: 可以把0当作-1,把1当作1来计算字符串的前缀和 这样的话,当两个位置的前缀 ...
- 牛客小白月赛30 J.小游戏 (DP)
题意:给你一组数,每次可以选择拿走第\(i\)个数,得到\(a[i]\)的分数,然后对于分数值为\(a[i]-1\)和\(a[i]+1\)的值就会变得不可取,问能得到的最大分数是多少. 题解:\(a[ ...
- java——字符串常量池、字符串函数以及static关键字的使用、数组的一些操作函数、math函数
字符串常量池: 字符串比较函数: 字符串常用方法: 字符串截取函数: 字符串截取函数: static关键字使用: 要调用类中的static类型的变量的时候,可以用"类名.变量名&quo ...
- Codeforces Round #654 (Div. 2) C. A Cookie for You (思维)
题意:有\(a\)个蛋糕,\(b\)个巧克力,第一类人有\(n\)个,总是吃多的东西(若\(a>b\),吃蛋糕,否则吃巧克力),第二类人有\(m\)个,总是吃少的,可以随便调整这两类人吃的顺序, ...
- C#之Dispose
前言 谈到Dispose,首先需要理解C#的资源 资源类型 托管资源:由CLR创建和释放 非托管资源:资源的创建和释放不由CLR管理.比如IO.网络连接.数据库连接等等.需要开发人员手动释放. 如何释 ...
- Linux系统编程【3.2】——ls命令优化版和ls -l实现
前情提要 在笔者的上一篇博客Linux系统编程[3.1]--编写ls命令中,实现了初级版的ls命令,但是与原版ls命令相比,还存在着显示格式和无颜色标记的不同.经过笔者近两天的学习,基本解决了这两个问 ...
- OpenStack Train版-9.安装neutron网络服务(计算节点)
在计算节点安装neutron网络服务(computel01计算节点192.168.0.20)安装组件 yum install openstack-neutron-linuxbridge ebtable ...
- python 3.7 安装 sklearn keras(tf.keras)
# 1 sklearn 一般方法 网上有很多教程,不再赘述. 注意顺序是 numpy+mkl ,然后 scipy的环境,scipy,然后 sklearn # 2 anoconda ana ...
- 局部变量 static new 结构体指针
struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {} }; 有一个函数利用LisNode ...