1+ import React from 'react'
2+ // import { h1 } from 'framer-motion/client'
3+ // 注意 tab 后可能会自动导入无关数据
4+
5+ export default class NumState extends React . Component {
6+ state = {
7+ num : this . props . number
8+ }
9+ constructor ( props ) {
10+ super ( props )
11+ setInterval ( ( ) => {
12+ this . setState ( prev => {
13+ // setState 第一个参数也可以是一个函数
14+ // 参数prev表示当前的状态
15+ // 该函数的返回结果,会混合(覆盖)掉之前的状态
16+ // 该函数是异步执行
17+ return {
18+ num : prev . num - 1
19+ }
20+ } )
21+ this . setState ( prev => {
22+ return {
23+ num : prev . num - 1
24+ }
25+ } )
26+ this . setState ( prev => {
27+ return {
28+ num : prev . num - 1
29+ }
30+ } )
31+ } , 2000 ) ;
32+ }
33+ handleClick = ( ) => {
34+ console . log ( " " )
35+ console . log ( "=== StateMulCallBack start" )
36+ this . setState ( prev => {
37+ // setState 第一个参数也可以是一个函数
38+ // 参数prev表示当前的状态
39+ // 该函数的返回结果,会混合(覆盖)掉之前的状态
40+ // 该函数是异步执行
41+ return {
42+ num : prev . num - 1
43+ }
44+ } )
45+ this . setState ( prev => {
46+ return {
47+ num : prev . num - 1
48+ }
49+ } )
50+ this . setState ( prev => {
51+ return {
52+ num : prev . num - 1
53+ }
54+ } )
55+ // , // setState的第二个参数:状态完成之后的回调函数
56+ // () => {
57+ // this.setState(
58+ // {
59+ // num: this.state.num - 1
60+ // }, this.setState(
61+ // {
62+ // num: this.state.num - 1
63+ // }))
64+ // })
65+
66+ // 多个并行的 setState 都是在 同一个之前状态 基础进行的操作,所以会被覆盖,
67+ // 正确应该是像上面一样在状态完成之后再进行操作
68+ // this.setState(
69+ // {
70+ // num: this.state.num - 1
71+ // })
72+
73+ // this.setState(
74+ // {
75+ // num: this.state.num - 1
76+ // })
77+ }
78+ render ( ) {
79+ // 并且 React会对异步的setState进行优化,将多次setState进行合并
80+ // 所以一次点击虽然事件中有三次 setState ,但是只会有一次 render
81+ console . log ( "=== render" )
82+ console . log ( "=== num" , this . state . num )
83+ return (
84+ < >
85+ < h1 > { this . state . num } </ h1 >
86+ < button onClick = { this . handleClick } > -</ button >
87+ </ >
88+ )
89+ }
90+ }
0 commit comments