美文网首页
React入门(2)-setSate()

React入门(2)-setSate()

作者: 申_9a33 | 来源:发表于2021-02-18 13:39 被阅读0次

1.State的异步更新

import React, { Component } from 'react'

export default class ClassComponent extends Component {
    constructor(props) {
        super(props)

        this.state = {
            counter: 0,
        }
    }

    changevalue = v => {
        this.setState({
            counter: this.state.counter + v
        }, () => {
            console.log('counter-2', this.state.counter) // 值变换后的回调函数
        })

        console.log('counter-1', this.state.counter)

    }

    setCounter = (e) => {
        this.changevalue(1)
    }


    componentDidMount() {
        this.changevalue(1)
    }

    componentWillUnmount() {
    }

    render() {
        const { counter } = this.state;
        return (
            <div>
                <h3>setStatePage</h3>
                <button onClick={this.setCounter}>counter:{counter}</button>
            </div>
        )
    }
}

在上述代码中,counter-1 为旧值,counter-2为新值

  • 1.回调中获取的状态是新值

  • 2.生命周期中调用setState,值是异步改变的。componentDidMount中可知)

    捕获.PNG
  • 3.组合事件中调用setState,值是异步改变的。(onClick={this.setCounter}中可知)

    捕获.PNG

2.state同步更新-定时器

import React, { Component } from 'react'

export default class ClassComponent extends Component {
    constructor(props) {
        super(props)

        this.state = {
            counter: 0,
        }
    }

    changevalue = v => {
        setTimeout(() => {
            this.setState({
                counter: this.state.counter + v
            })
            console.log('counter', this.state.counter)
        }, 0)
    }

    setCounter = (e) => {
        this.changevalue(1)
    }


    componentDidMount() {
        this.changevalue(1)
    }

    render() {
        const { counter } = this.state;
        return (
            <div>
                <h3>setStatePage</h3>
                <button onClick={this.setCounter}>counter:{counter}</button>
            </div>
        )
    }
}

  • setStatesetTimeout 中调用时,counter 值是立刻更新的
  • 生命周期调用结果


    捕获.PNG
  • 点击事件结果


    捕获.PNG

3.state同步更新-原生事件

import React, { Component } from 'react'

export default class ClassComponent extends Component {
    constructor(props) {
        super(props)

        this.state = {
            counter: 0,
        }
    }

    changevalue = v => {
        this.setState({
            counter: this.state.counter + v
        })
        console.log('counter', this.state.counter)
    }

    setCounter = (e) => {
        this.changevalue(1)
    }


    componentDidMount() {
        document.body.addEventListener('click', this.setCounter, false)
    }

    render() {
        const { counter } = this.state;
        return (
            <div>
                <h3>setStatePage</h3>
                <button>counter:{counter}</button>
            </div>
        )
    }
}
  • document.body.addEventListener('click', this.setCounter, false),在原生事件中,调用setStatecounter值也是立刻更新的
  • 点击原生事件结果


    捕获.PNG

4.合并更新

import React, { Component } from 'react'

export default class ClassComponent extends Component {
    constructor(props) {
        super(props)

        this.state = {
            counter: 0,
        }
    }

    changevalue = v => {
        this.setState({
            counter: this.state.counter + v
        })
        console.log('counter', this.state.counter)
    }

    setCounter = (e) => {
        this.changevalue(1)
        this.changevalue(2)
    }

    render() {
        const { counter } = this.state;
        return (
            <div>
                <h3>setStatePage</h3>
                <button onClick={this.setCounter}>counter:{counter}</button>
            </div>
        )
    }
}
  • 点击按钮得到结果为:2,理论上应该为3
    捕获.PNG
  • 处于性能考虑,react可能会把多个setState()调用合并为一个调用

5.链式调用

import React, { Component } from 'react'

export default class ClassComponent extends Component {
    constructor(props) {
        super(props)

        this.state = {
            counter: 0,
        }
    }

    changevalue = v => {
        this.setState(state => ({
            counter: state.counter + v
        }), () => {
            console.log('counter', this.state.counter)
        })

    }

    setCounter = (e) => {
        this.changevalue(1)
        this.changevalue(2)
    }

    render() {
        const { counter } = this.state;
        return (
            <div>
                <h3>setStatePage</h3>
                <button onClick={this.setCounter}>counter:{counter}</button>
            </div>
        )
    }
}
  • this.setState(state => ({ counter: state.counter + v }))可以链式调用,从而得到正确结果3
    捕获.PNG

相关文章

网友评论

      本文标题:React入门(2)-setSate()

      本文链接:https://www.haomeiwen.com/subject/sxwgxltx.html