【问题标题】:setState is not working within componentDidMount()setState 在 componentDidMount() 中不起作用
【发布时间】:2020-01-04 03:48:44
【问题描述】:

对于发布重复的问题,我深表歉意,但在阅读了所有以前的答案后,我无法让我的代码正常工作。

在我的代码中,我尝试使用 queryString 读取 URL 参数并使用 setState() 更新状态。全部在 componentDidMount() 方法中。


import React, {Component} from 'react';
import ChartBox from "./chartBox";
import Header from "./header";
import Footer from "./footer";
import Greeting from "./greeting";
import Menu from "./menu";
import Navbar from "./navbar";
import queryString from "query-string";



class Body extends Component{
    constructor(props){
        super(props);
        this.state = {
            username:""
        };
    }


    componentDidMount(){
        let user = queryString.parse(this.props.location.search);
        this.setState({username: user});

        console.log(this.state.username);
        console.log(user.user);
    }

    render(){
        return(
       <div>
           <Header />
           <Navbar />
           <Greeting user = {this.state.username}/>
           <ChartBox user = {this.state.username}/>
           <Menu user = {this.state.username}/>
           <Footer />
       </div>
        )
    }
}

export default Body;

queryString 工作正常,并为user 变量获取正确的值。 this.setState({username: user}); 不更新状态 - 我不明白为什么。 即使我将初始状态显式设置为某个值,{this.state.username} 也不会将undefined 传递给子组件。

我看到有人提到这可能是范围问题,但另一方面,我在互联网上看到的示例与我的没有什么不同。我现在完全糊涂了。

非常感谢任何帮助。

【问题讨论】:

标签: reactjs setstate


【解决方案1】:

setState() 不保证是同步的。 this.state.username 将在 componentDidMount() 返回后一段时间更新

【讨论】:

    【解决方案2】:

    setState 是异步的。

    这意味着您不能在一行调用setState 并假设下一行的状态已更改。

    setState({ name: "Michael" });
    console.log(this.state.name);  //it won't show current updated state
    

    如何检查?

    setState({ name: "Michael" },()=>{
      console.log(this.state.name);
    });
    

    在这里您可以通过回调检查您的状态是否更新。

    演示https://codesandbox.io/s/asynchronous-fc9zx

    【讨论】:

    • 感谢您的回答。在这种情况下,如何将 URL 参数作为 prop 传递给子组件?
    • @Jack_loc 嘿检查演示应用程序,我提到了如何在子组件内部传递和访问
    • 抱歉 Vahid Akhtar,但我无法理解您提到的沙箱中的代码。可能是因为我对 React 还知之甚少。
    • 抱歉 Vahid Akhtar,但我无法理解您提到的沙箱中的代码。可能是因为我对 React 还知之甚少。我摆脱了 qyerySring 并手动解析了 URL。将我的组件转换为功能组件并使用 useEffect 设置状态。所有这些都奏效了。但是正如您所提到的, setState 是异步的,并且在组件渲染后会更新,这对我来说没有用。它以未定义的形式传递给子组件,它们使用未定义的参数获取数据库。只有在父组件中的状态被更新之后。我想我会留下这个想法,直到我了解更多 React。
    猜你喜欢
    • 2016-05-13
    • 2021-01-29
    • 2016-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    相关资源
    最近更新 更多