Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用componentDidUpdate更改组件中的状态_Javascript_Reactjs_Typescript_Axios - Fatal编程技术网

Javascript 使用componentDidUpdate更改组件中的状态

Javascript 使用componentDidUpdate更改组件中的状态,javascript,reactjs,typescript,axios,Javascript,Reactjs,Typescript,Axios,我有两个组件放在一个容器中。一个是调用出版物的Id,另一个是调用特定publicationId的发行日期 当我调用Id例如100时,它也会从该Id加载问题。之后,我还可以在issueDate上进行筛选。但是,当我再次使用Id更改组件以获得其他问题列表时,它将不会使用这些问题重新提交组件 我听说使用componentDidMount解决了这个问题,但我不知道在这个步骤之后该怎么办: public componentDidUpdate(): void { const{ data, date

我有两个组件放在一个容器中。一个是调用出版物的
Id
,另一个是调用特定
publicationId
的发行日期

当我调用
Id
例如
100
时,它也会从该
Id
加载问题。之后,我还可以在
issueDate
上进行筛选。但是,当我再次使用
Id
更改组件以获得其他问题列表时,它将不会使用这些问题重新提交组件

我听说使用
componentDidMount
解决了这个问题,但我不知道在这个步骤之后该怎么办:

 public componentDidUpdate(): void {
    const{ data, date } = this.state
    if (this.state.data !== data) {

//don't know what to do in this if statement

} 
这是使用axios获取出版物
Id
的代码:

 constructor(props: TTestProductionProgressStatus) {
    super(props);
    this.state = {
      date: null,
      data: undefined,
      prodItem: []
    };
  }

  public componentDidMount(): void {
    const urlDate = this.props.location.pathname.split("/")[3];
    const date = urlDate
      ? new Date(
          `${urlDate.substr(0, 4)}-${urlDate.substr(4, 2)}-${urlDate.substr(
            6,
            2
          )}T00:00:00.000+01:00`
        )
      : null;
    axios
      .get<Definitions.ProductionProgressStatus[]>(
        "http://app30:665/v1/productionProgressStatus/crud?publicationId=" +
          this.props.id
      )
      .then(res => {
        this.setState(
          {
            data: res.data
          },
          () => this.handleDateChange(date)
        );
      })
      .catch(error => console.log(error.response));
  }
构造函数(道具:TTestProductionProgressStatus){
超级(道具);
此.state={
日期:空,
数据:未定义,
项目:[]
};
}
公共组件didmount():void{
const urlDate=this.props.location.pathname.split(“/”[3];
const date=urlDate
?新日期(
`${urlDate.substr(0,4)}-${urlDate.substr(4,2)}-${urlDate.substr(
6.
2.
)}T00:00:00.000+01:00`
)
:null;
axios
.得到(
"http://app30:665/v1/productionProgressStatus/crud?publicationId=" +
这是道具id
)
。然后(res=>{
这是我的国家(
{
数据:res.data
},
()=>此.HandleDate更改(日期)
);
})
.catch(error=>console.log(error.response));
}

首先要说明的是,您的比较不正确:

const{ data, date } = this.state
if (this.state.data !== data) {
在这里,您正在将
this.state.data
this.state.data
进行比较;你只是用两种不同的方法提取它,但是你比较的是相同的属性。比较新旧状态的方法是:


至于在if语句中执行的操作,您可能希望对
setState
进行某种调用,这将导致另一次更新。一般来说,最好尽可能避免层叠更新,这样就不会不必要地引发两种不同的重新渲染;换句话说,如果您发现有机会在不使用
componentdiddupdate
的情况下更改内容,那就更好了。

首先要解决的是您的比较不正确:

const{ data, date } = this.state
if (this.state.data !== data) {
在这里,您正在将
this.state.data
this.state.data
进行比较;你只是用两种不同的方法提取它,但是你比较的是相同的属性。比较新旧状态的方法是:


至于在if语句中执行的操作,您可能希望对
setState
进行某种调用,这将导致另一次更新。一般来说,最好尽可能避免层叠更新,这样就不会不必要地引发两种不同的重新渲染;换句话说,如果您有机会在不使用
componentdiddupdate
的情况下更改内容,那就更好了。

谢谢您让我的问题更具可读性。我对stack还不熟悉,但是让别人慢慢来是很感激的。谢谢你让我的问题更具可读性。我是个新手,但让别人慢慢来是很感激的。