我的道具在 React 的 ComponentDidMount 方法下的价值未定义

Posted

技术标签:

【中文标题】我的道具在 React 的 ComponentDidMount 方法下的价值未定义【英文标题】:My props are valued undefined under ComponentDidMount method in React 【发布时间】:2020-12-15 11:24:57 【问题描述】:

为什么我在this.propsthis.state 下的值在我的componentDidMount 方法中未定义?在我的类组件的其他部分,我可以正确访问我的道具和状态值。我是否需要将它们单独传递到某个地方或我在哪里犯了任何错误?

我没有得到任何值:

componentDidMount() 
    console.log(this.props.token)
    console.log(this.state.training.coach)
    // values are null and undefined.
    if (this.props.token == this.state.training.coach) 
        this.setState(
            iscreator: true
        );
        console.log(this.state.iscreator)
     else 
        this.setState(
            iscreator: false
        );
    

访问this.props.token 时我得到正确的值:

handleDelete = (event) => 
    if (this.props.token !== null) 
        const trainingID = this.props.match.params.trainingID;
        axios.defaults.headers = 
                "Content-Type": "application/json",
                Authorization: this.props.token
            
        axios.delete(`http://127.0.0.1:8000/api/$trainingID/`)
        this.props.history.push('/');
        this.forceUpdate();
     else 
    
    

【问题讨论】:

【参考方案1】:

this.setState 是异步的,这意味着之后的函数不会等到它完成,所以如果你 console.log 更新后你的状态可能仍然具有旧值。

要解决此问题,您可以在 render 中检查您的状态值,它最终会更新,或者您可以运行 setState 并带有这样的回调

this.setState(iscreator: true, () => console.log(this.state.iscreator) )

这确保仅在 setState 完成后运行 console.log

【讨论】:

是的,但为什么我的 this.props.token 和 this.state.training.coach 值未定义? 因为它只需要一小部分时间就可以更新,而当您单击调用handleDelete 的按钮时,setState 已经完成。 但是当我将这些值控制在 setState 之上时,它们应该有一些东西。为什么那些是空的?或者我应该怎么做才能让它工作?

以上是关于我的道具在 React 的 ComponentDidMount 方法下的价值未定义的主要内容,如果未能解决你的问题,请参考以下文章

我应该在我的 HOC 中哪里使用 useEffect 来接收 React 中的道具?

在没有道具的 Typescript 中使用 React.forwardRef

Typescript & React:在组件之间传递道具与默认道具

每次使用相同的给定道具 React Memo 渲染

如何在我的 React linter 中修复“声明的道具类型中的错字:标题”?

React - 发送 ref 作为道具不起作用