【问题标题】:setState update value but displays old valuesetState 更新值但显示旧值
【发布时间】:2020-10-14 20:01:27
【问题描述】:

这只是显示一个初始字符串。然后,当单击按钮时,它会更改字符串。

但在运行时,它会显示初始字符串。然后,当单击按钮时,您可以看到字符串在一瞬间发生了变化。 (新值的控制台日志也会被触发 - 并且有效)。但是,然后旧字符串再次显示。

如果对状态进行了更改,为什么它会恢复?

这是显示字符串的代码:

// Display.js
import React from 'react';

class Display extends React.Component {
    constructor(props) {
        super(props);
         this.state = {
            blogPosts: "The Bingham Blog"
        };
        this.clickHandler=this.clickHandler.bind(this);
    }

    clickHandler() {
        this.setState({
            blogPosts: "Changed!!!!!!!"
        }, () => {console.log(this.state.blogPosts)});
    }
    
    render() {
        return (
            <p>
                <form>
                    <button onClick={this.clickHandler}>Add on</button>
                </form>
                {this.state.blogPosts}
            </p>
        );
    }
}

export default Display;

这里是调用&lt;Display /&gt;组件的App.js文件:

import React from 'react';
import Display from "./Display";

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <h1>Enter text for the blog</h1>
      </header>
    <div className="display">
        <Display />
      </div>
    </div>
  );
}

export default App;

我已经为此苦苦挣扎了好几天。 我知道这很可能是 setState 的异步特性,但我不知道如何解决。

【问题讨论】:

标签: javascript reactjs setstate


【解决方案1】:

原因是如果您在&lt;form&gt; 中有一个&lt;button&gt;,当您单击该&lt;button&gt; 时,它将触发该表单的提交操作。

因此,您应该为按钮提供类型属性。 type="button"

<button type="button" onClick={this.clickHandler}>Add on</button>

【讨论】:

  • 噢噢噢噢噢噢噢噢噢噢!非常感谢你。我快要失去理智了。完全新手移动。再次感谢!
【解决方案2】:

因为您的按钮位于 &lt;form&gt; 标记内。默认情况下,单击按钮时,表单将提交,并且会重新加载浏览器选项卡。这就是您的状态恢复到初始状态的原因。尝试将您的按钮移出该表单。它应该可以工作。

【讨论】:

  • 正确。或者,您可以将 e.preventDefault() 放在事件处理程序的顶部。
  • 你是最棒的!非常感谢。我正在失去理智。一旦我通过了这些新手的东西,我就可以进入 React 的真正内容。再次非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2021-01-21
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2019-07-07
相关资源
最近更新 更多