Skip to content

Commit 8b6e0b3

Browse files
committed
加入react事件Demo
1 parent 50942f4 commit 8b6e0b3

File tree

17 files changed

+2127
-0
lines changed

17 files changed

+2127
-0
lines changed

react/event/.editorconfig

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# http://editorconfig.org
2+
root = true
3+
4+
[*]
5+
indent_style = space
6+
indent_size = 2
7+
end_of_line = lf
8+
charset = utf-8
9+
trim_trailing_whitespace = true
10+
insert_final_newline = true
11+
12+
[*.md]
13+
trim_trailing_whitespace = false
14+
15+
[Makefile]
16+
indent_style = tab

react/event/.gitignore

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/npm-debug.log*
6+
/yarn-error.log
7+
/yarn.lock
8+
/package-lock.json
9+
10+
# production
11+
/dist
12+
13+
# misc
14+
.DS_Store
15+
16+
# umi
17+
/src/.umi
18+
/src/.umi-production
19+
/src/.umi-test
20+
/.env.local

react/event/.prettierignore

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
**/*.md
2+
**/*.svg
3+
**/*.ejs
4+
**/*.html
5+
package.json
6+
.umi
7+
.umi-production
8+
.umi-test

react/event/.prettierrc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"singleQuote": true,
3+
"trailingComma": "all",
4+
"printWidth": 80,
5+
"overrides": [
6+
{
7+
"files": ".prettierrc",
8+
"options": { "parser": "json" }
9+
}
10+
]
11+
}

react/event/.umirc.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { defineConfig } from 'umi';
2+
3+
export default defineConfig({
4+
nodeModulesTransform: {
5+
type: 'none',
6+
},
7+
history: {
8+
type: 'hash',
9+
},
10+
fastRefresh: {},
11+
});

react/event/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# umi project
2+
3+
## Getting Started
4+
5+
Install dependencies,
6+
7+
```bash
8+
$ yarn
9+
```
10+
11+
Start the dev server,
12+
13+
```bash
14+
$ yarn start
15+
```

react/event/mock/.gitkeep

Whitespace-only changes.

react/event/package.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"private": true,
3+
"scripts": {
4+
"start": "umi dev",
5+
"build": "umi build",
6+
"postinstall": "umi generate tmp",
7+
"prettier": "prettier --write '**/*.{js,jsx,tsx,ts,less,md,json}'",
8+
"test": "umi-test",
9+
"test:coverage": "umi-test --coverage"
10+
},
11+
"gitHooks": {
12+
"pre-commit": "lint-staged"
13+
},
14+
"lint-staged": {
15+
"*.{js,jsx,less,md,json}": [
16+
"prettier --write"
17+
],
18+
"*.ts?(x)": [
19+
"prettier --parser=typescript --write"
20+
]
21+
},
22+
"dependencies": {
23+
"@ant-design/pro-layout": "^6.5.0",
24+
"react": "17.x",
25+
"react-dom": "17.x",
26+
"umi": "^3.5.36"
27+
},
28+
"devDependencies": {
29+
"@types/react": "^17.0.0",
30+
"@types/react-dom": "^17.0.0",
31+
"@umijs/preset-react": "1.x",
32+
"@umijs/test": "^3.5.36",
33+
"lint-staged": "^10.0.7",
34+
"prettier": "^2.2.0",
35+
"typescript": "^4.1.2",
36+
"yorkie": "^2.0.0"
37+
}
38+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import React, { useEffect } from 'react';
2+
3+
const App:React.FC<any> = (props)=>{
4+
useEffect(()=>{
5+
//React事件有两步
6+
//原生事件冒泡,从底层一起触发到document的冒泡
7+
//合成事件冒泡,React创建的事件,从React底层组件到React顶层组件的冒泡。合成事件绑定是通过隐式绑定document的原生事件来实现的。
8+
//所以,事件的方式是底层原生事件->document第一次隐式绑定事件(合成事件冒泡)->document第二次显式绑定的事件
9+
/*
10+
合成事件的意义在抹平不同浏览器上的事件差异,而且避免在列表的每个DOM上都挂载一个事件,造成灾难
11+
*/
12+
const documentClick = ()=>{
13+
console.log('document click');
14+
}
15+
const divClick = ()=>{
16+
console.log('原生outClick');
17+
}
18+
document.addEventListener('click', documentClick);
19+
document.getElementById('div1')?.addEventListener('click',divClick);
20+
return ()=>{
21+
document.removeEventListener('click',documentClick);
22+
document.getElementById('div1')?.removeEventListener('click',divClick);
23+
}
24+
},[]);
25+
26+
const outerClick = ()=>{
27+
console.log('outerClick');
28+
}
29+
30+
const innerClick = ()=>{
31+
console.log('innerClick');
32+
}
33+
//http://www.qiutianaimeili.com/html/page/2020/04/2020426gbkc8mhwpfi.html
34+
/*
35+
因此我们点击inner的div的时候,输出是:
36+
原生outClick
37+
innerClick
38+
outerClick
39+
document click
40+
*/
41+
return(
42+
<div id="div1" onClick={outerClick}>
43+
this is outer
44+
<div onClick={innerClick}>
45+
this is inner
46+
</div>
47+
</div>
48+
)
49+
}
50+
51+
export default App;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import React, { useEffect ,MouseEvent} from 'react';
2+
3+
const App:React.FC<any> = (props)=>{
4+
useEffect(()=>{
5+
const documentClick = ()=>{
6+
console.log('document click');
7+
}
8+
const divClick = ()=>{
9+
console.log('原生outClick');
10+
}
11+
document.addEventListener('click', documentClick);
12+
document.getElementById('div1')?.addEventListener('click',divClick);
13+
return ()=>{
14+
document.removeEventListener('click',documentClick);
15+
document.getElementById('div1')?.removeEventListener('click',divClick);
16+
}
17+
},[]);
18+
19+
const outerClick = ()=>{
20+
console.log('outerClick');
21+
}
22+
23+
const innerClick = (e:MouseEvent<HTMLDivElement>)=>{
24+
console.log('innerClick');
25+
//这个方法只能阻止合成事件,不能阻止原生事件
26+
e.stopPropagation();
27+
//这个方法能阻止原生事件,但只能阻止document上的原生事件,不能触发原始click
28+
e.nativeEvent.stopImmediatePropagation();
29+
}
30+
//http://www.qiutianaimeili.com/html/page/2020/04/2020426gbkc8mhwpfi.html
31+
/*
32+
因此我们点击inner的div的时候,输出是:
33+
原生outClick
34+
innerClick
35+
document click
36+
这个时候,少了outerClick这个合成事件的触发,以及少了document上的原生事件
37+
但是!!,不会少了div1上的原生事件触发,这是因为合成事件是在document上的原生事件上实现的。合成事件是div的原生事件冒泡上来后的产物,不可能在停止冒泡后,能回滚之前的事件输出
38+
*/
39+
return(
40+
<div id="div1" onClick={outerClick}>
41+
this is outer
42+
<div onClick={innerClick}>
43+
this is inner
44+
</div>
45+
</div>
46+
)
47+
}
48+
49+
export default App;

0 commit comments

Comments
 (0)