Javascript 反应路由器,页面重新加载后道具消失

Javascript 反应路由器,页面重新加载后道具消失,javascript,reactjs,react-router,Javascript,Reactjs,React Router,我已经被这个问题困扰了一段时间,但我真的无法找到答案,也无法集中精力解决这个问题。。 所以,我得到了一个主要组件,为我的其他组件提供一个称为主题的道具 App.js -------------------------------- getSubjects() { if(Auth.isUserAuthenticated()) { let headers = new Headers(); headers.append('Authorization', `bea

我已经被这个问题困扰了一段时间,但我真的无法找到答案,也无法集中精力解决这个问题。。 所以,我得到了一个主要组件,为我的其他组件提供一个称为主题的道具

App.js
--------------------------------
getSubjects() {
    if(Auth.isUserAuthenticated()) {
        let headers = new Headers();
        headers.append('Authorization', `bearer ${Auth.getToken()}`);
        let fetchInit = {
            method: 'GET',
            headers: headers
        };

        return (
            fetch('api/subjects', fetchInit)
                .then(this.getJSON)
                .then((data) => {
                    this.setState({
                        subjects: data.doc
                    });
                })
        )
    }
}

<Route path='/editsubject/:id' render={(props) => <EditSubject {...props} 
subjects={this.state.subjects}/>

Edit.js
---------------------------------
componentWillMount() {
    let paramId = this.props.match.params.id;
    let isSubjectItem = this.props.subjects.filter((sub) => {
        return sub._id === paramId;
    })[0];
    this.setState({subject: isSubjectItem});
}
App.js
--------------------------------
getSubjects(){
if(Auth.isUserAuthenticated()){
let headers=新的headers();
append('Authorization','bearer${Auth.getToken()}`);
让fetchInit={
方法:“GET”,
标题:标题
};
返回(
fetch('api/subjects',fetchInit)
.then(this.getJSON)
。然后((数据)=>{
这是我的国家({
主题:data.doc
});
})
)
}
}
编辑.js
---------------------------------
组件willmount(){
设paramId=this.props.match.params.id;
让IssubObjectItem=this.props.subjects.filter((子项)=>{
返回sub._id==paramId;
})[0];
this.setState({subject:isSubjectItem});
}
所有这些都很好,我可以通过编辑组件中的状态使用我的主题。 总之,每当我尝试重新加载/刷新页面时,应用程序就会崩溃。props.subjects未定义。我猜App.js发送Edit的部分,当页面在Edit组件中重新加载时,道具永远不会调用

localStorage例程在我脑海中闪过,但我宁愿避免它,希望它只是我在如何使用react方面遗漏的一些关键部分


任何帮助都将不胜感激!谢谢

事实上,当您刷新页面并直接进入router editsubject时,有可能未定义主题(getSubjects尚未加载)。我不知道在哪里调用getSubjects方法,但也许在应用构造函数或componentDidMount中是最好的地方

要解决未定义的问题,应该使用defaultProps。像这样:

Edit.defaultProps = {
  subjects: [],
};

这样,您就不需要设置if条件来查看主题中是否有数据,当component father中的方法加载主题时,一切都会正常工作。

事实上,当您刷新页面并直接进入路由器editsubject时,主题可能未定义(getSubjects尚未加载)。我不知道在哪里调用getSubjects方法,但也许在应用构造函数或componentDidMount中是最好的地方

要解决未定义的问题,应该使用defaultProps。像这样:

Edit.defaultProps = {
  subjects: [],
};

这样,您就不需要设置if条件来查看主题中是否有数据,当component father中的方法加载主题时,一切正常。

刷新页面时,所有组件状态和道具都将消失。您需要设置一些条件,如if
typeof this.props.subjects!='未定义“
则只能继续,否则将显示某种加载程序或其他内容。刷新页面时,所有组件状态和道具都将消失。您需要设置一些条件,如if
typeof this.props.subjects!='未定义“
则仅继续,否则将显示某种加载程序或其他内容。