为什么第一点击按钮的打印结果是“bb”,第二次打印结果是“e”,应该是每次打印的结果都是“e”才对 这是为什么

我想要达到的结果
html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>

    <style>
        .home {
            margin: 100px auto;
            width: 500px;
            background-color: rgb(148, 92, 19);
        }

        .test {
            background-color: red;
        }

        img {
            width: 200px;
            height: 120px;
        }
    style>
head>

<body>
    <div class="home">
        <div class="test">div>
    div>
    <script type="text/javascript" src="react.development.js">script>
    <script type="text/javascript" src="react-dom.development.js">script>
    <script type="text/javascript" src="babel.min.js">script>
    <script type="text/babel">
        class Hellow extends React.Component {
            constructor(props) {
                super(props)
                this.state = { ele: 'bb' }
            }
            getEle = (e) => {
                console.log(e);
                // this.setState({ ele: 'f' });
                // console.log(this.state.ele);
            }
            render() {
                return (
                    <div ref={this.getEle}>
                        <h3>nice dayh3>
                        <img src="one.jpg" alt="">img><br>br>
                        <button onClick={this.addPicture}>add photobutton>
                    div>
                )

            }
            addPicture = () => {
                this.setState({ ele: 'e' });
                console.log(this.state.ele);
            }
        }
        ReactDOM.render(<Hellow />, document.querySelector('.test'))
    script>
body>

html>

setState是一个异步函数,类似于接口请求,它的第二个参数是一个回调函数,如果你需要在更新state之后做一些操作,在这个回调函数中就可以获取到最新的state值

this.setState({ ele: 'e' }, (state) => {
  console.log(this.state.ele)
});

这个setState的机制导致它有点像异步,所以第一次setState的时候值其实还没改完,就已经console了。你可以用个setTimeout把这个setState跟console这两句语句包起来,就正常了会有你要的效果。至于细节,我觉得这个文章说的很详细,讲述它这一机制
https://m.jb51.net/article/252671.htm