React-component-class-setState

官方文档:State & 生命周期 – React

<body>
    <script src="https://unpkg.com/react@17/umd/react.development.js" crossorigin></script>
    <script src="https://unpkg.com/react-dom@17/umd/react-dom.development.js" crossorigin></script>
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>
    <div id="app"></div>
    <script type="text/babel">

        // setState
        class App extends React.Component{
            state = {a:0,b:0,c:0}
            handleClick = () => {
                // 1.验证组件实例
                console.log(this);//组件实例

                // 2.直接赋值,不能触发渲染,不能执行render,状态不改变(强制执行可以执行render)
                // this.state.a = 1
                // console.log(this.state.a);//输出:1

                // 3、setState:改变值并触发render
                this.setState({
                    a:1
                })

                // 4、setState:异步的(条件:合成事件里) 触发了render
                // this.setState({
                //     a:1
                // })
                // console.log(this.state.a);

                // 5.多次调用setState
                // setState是异步的
                // 三次setState=>render执行一次=>数据全部修改=>机制:批量更新(react的性能优化)=>批量更新完毕=>render 
                // 所以react批量更新发生在render之前,是react性能优化机制
                // this.setState({a:1})
                // this.setState({b:1})
                // this.setState({c:1})
                // console.log(this.state);
                // 输出:第一步:{a: 0, b: 0, c: 0}
                

                // 6.获取异步的值
                this.setState({a:1})
                this.setState({a:this.state.a=1},()=>{
                    console.log('callback',this.state.a);
                })
                console.log(this.state.a);

                // 7.累加隐患
                this.setState({a:1})
                this.setState({a:this.state.a+1})
                this.setState({a:this.state.a+1})
                // 最后合并
                this.setState({a:1})
                console.log(this.state.a);//输出:0 原因:setState异步原因
                // 数据显示也是1 原因:累加隐患调用serState更新值的时候,有依赖于state数据,出现累加隐患,累加隐患:不依赖于上一次的数据进行下一次数据的计算
                this.setState({a:1})
                this.setState({a:this.state.a+2})
                this.setState({a:this.state.a+3})
                // 只取最后一个执行 输出3 6 9...
                // 最后合并
                this.setState({a:3})

                

                // 7.累加隐患解决
                // setState传函数解决累加隐患
                this.setState({a:1})
                this.setState((preState,props)=>{
                    return {a:preState.a+1}
                })
                this.setState((preState,props)=>{
                    return {a:preState.a+1}
                })
                this.setState((preState,props)=>{
                    return {a:preState.a+1}
                },()=>{
                    console.log('callback',this.state.a);
                })
                // 理解:实际相当于数组
                // [
                // (preState,props)=>{
                // return {a:preState.a+1}
                // },
                // (preState,props)=>{
                // return {a:preState.a+1}
                // },
                // (preState,props)=>{
                // return {a:preState.a+1}
                // }
                // ]

                //setSate参数方式总结:
                // setState({}) 设置值 异步 获取不到值 无法获取setSate设置的值 存在累计隐患
                // setState({},()=>{}) 获取设置完成后的值 没有依赖
                // setState(()={},()=>{}) 能够产生依赖 获取值
            }
            render(){
                console.log('render--');
                return(
                    <div>
                        <h1>
                            {this.state.a}
                        </h1>
                        <h1>
                            {this.state.b}
                        </h1>
                        <h1>
                            {this.state.c}
                        </h1>
                        {/*onClick onChange等:合成事件 对事件进行了包装(事件代理和委托)*/}
                        <button onClick = {this.handleClick}>click</button>
                    </div>
                )
            }
        }


    ReactDOM.render(<App />,document.getElementById('app'))
    </script>
</body>

setState异步,4控制台输出:

setState存在累加隐患,控制台输出:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值