参考链接:https://stackoverflow.com/questions/38256332/in-react-whats-the-difference-between-onchange-and-oninput

DOM 的oninputonchange


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 中的onInputonChange

参考 Document how React's onChange relates to onInput

React 的onInputonChange并没有多少区别,其作用都是在用户持续输入的时候触发,不在失去获取或者失去焦点的时候触发。

要获取焦点相关的事件需要通过onFocusonBlur。而需要检测用户输入的内容是否有变化则需要手动去取值对比,没有原生的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>,而onChangeReact.ChangeEvent<HTMLInputElement>,已经区分开了表单Form事件和Change事件。

onChange对应的多个target,猜测是因为onChange可以用在其他的元素上,传入的泛型不一定是HTMLInputElement,如select

selectonchange事件:

((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层面能看出的就是onInputonChange基于的事件不一样(React.FormEventReact.ChangeEvent),而onChange事件可用于不同的元素中,target也可能是不同的元素对象。

最新文章

  1. 由js apply与call方法想到的js数据类型(原始类型和引用类型)
  2. JS截字符串处理数字,汉字,英文问题
  3. JavaScript confirm 自定义风格及功能实现
  4. W.Richard Stevens sock program
  5. MySQL的热备percona-xtrabackup、innobackupex的安装方法
  6. (2)apply函数及其源码
  7. PL/SQL 创建视图语法
  8. HTML+CSS小实战案例
  9. Guava 的学习
  10. cocos2d-html5 笔记3: Node
  11. [LeetCode#104, 111]Maximum Depth of Binary Tree, Minimum Depth of Binary Tree
  12. 【jQueryMobile】Helloworld而页面切换
  13. T-SQL技术收集——删除重复数据
  14. C#多线程的用法7-线程间的协作ManualResetEvent
  15. Project 8:利用递归算法求最大值
  16. RecyclerView的点击、滑动、拖动事件
  17. lnmp 安装opencart出现open_basedir 错误解决办法
  18. epoll+socket实现 socket并发 linux服务器
  19. j2EE基础知识
  20. svn提交出现错误 svn: Working copy &#39;D:\...&#39;locked.

热门文章

  1. HDU-6874 Decision 倍增 (2020 HDU多校 D7 D)
  2. hdu 6268 Master of Subgraph(点分治+bitset)
  3. Codeforces Round #636 (Div. 3)
  4. Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2) D. XOR-gun (二进制,异或,前缀和)
  5. 同时拿到BATJMD的Offer是怎样的一种体验?
  6. 1.ASP.NET Core 管道、中间件、依赖注入
  7. C- c常见问题分析
  8. python 3.7 安装 sklearn keras(tf.keras)
  9. Java之一个整数的二进制中1的个数
  10. VSCode VUE常用配置