React基础
事件
特点:
- event 是 SyntheticEvent,模拟出来 DOM 事件所有能力;
- event.nativeEvent 是原生事件对象;
- 所有的事件,都被挂在到 document 上(react 17+ 是绑定到 root 节点上,这样有利于多个 React 版本共存,例如微前端)
原理
-
react 首先在 root 上挂载不同的事件,比如 click、mouseup、...
- root.addEventListener('click', (e) => {...});
-
当页面上的 button 点击时,就会冒泡到 root 上,这时候就会触发 react 在 root 上的绑定事件,并可以根据 e.target 拿到 DOM,然后再根据真实 DOM 获取到虚拟 DOM 和虚拟 DOM 上我们自定义的事件,然后触发这个事件,并把 React 自己合成的事件对象传过来
为什么 React 能根据真实 DOM 获取到虚拟 DOM?原因是在构建 DOM 树的时候,在真实 DOM 上挂载了虚拟 DOM 的引用(__reactFiber)。

setState
在 React <= v17 的版本中,setState 可能是异步的,可能会被合并。
const handleClick = () => {
setState({
count: count + 1,
});
console.log(count);
}
如果 count 初始值是 0,当点击的时候会加1,但是打印结果是 0,说明 setState 是异步的。
const handleClick = () => {
setTimeout(() => {
setState({
count: count + 1,
});
console.log(count);
}, 0);
}
const bodyClickHandler = () => {
document.bdoy.addEventListener('click', () => {
setState({
count: count + 1,
});
console.log(count);
});
}
把 setState 操作放在 setTimeout 中发现就会变成同步的。在自定义的 DOM 事件中,setState 也是同步的。