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 试图设置倒计时计时器,但从componentdidmount传递数据时未定义_Javascript_Reactjs_Momentjs - Fatal编程技术网

Javascript 试图设置倒计时计时器,但从componentdidmount传递数据时未定义

Javascript 试图设置倒计时计时器,但从componentdidmount传递数据时未定义,javascript,reactjs,momentjs,Javascript,Reactjs,Momentjs,这是我的代码行。我无法从const{quests}=this.props访问数据我正在从redux州提取它,并且我正在得到未定义的代码。我试图将我的代码放在组件上。我的问题在未定义时得到了解决。然而,我不能让时间滴答作响,我的页面也不能重新呈现 componentDidUpdate() { const { quests } = this.props || {} let getTime; getTime = quests.item

这是我的代码行。我无法从
const{quests}=this.props访问数据我正在从redux州提取它,并且我正在得到未定义的代码。我试图将我的代码放在组件上。我的问题在未定义时得到了解决。然而,我不能让时间滴答作响,我的页面也不能重新呈现

 componentDidUpdate() {
        const { quests } = this.props || {}
        let getTime;
        
        getTime = quests.items?.items?.map(quests => {
            let startTime = Date.parse(quests.createdAt)
            let endTime = Date.parse(quests.expiresAt)
            let timeLimit = endTime - startTime;
            let timeDuration = moment.duration(timeLimit*1000, 'milliseconds');
            let interval = 1000;
            let today = moment().utc();
            
            quests.timeDuration = timeDuration

            setInterval(() => {
                timeDuration = moment.duration(timeDuration - interval, 'milliseconds')    
                quests.timeDuration = timeDuration
                
            }, interval)
        })
        return getTime;
    }

你的计时器功能正在改变道具(这是不好的),因为它直接改变任务,但它不会导致状态或道具的可识别更新,因此不会重新排序。类似的东西可能会起作用,如果项目中没有更多的代码,很难提供一个有用的示例,但这可能会给你一个想法

state = {
  quests: [],
  elapsedSeconds: 0,
}

componentDidUpdate(prevProps) {
  if (!prevProps.quests && this.props.quests) {
    const { quests } = this.props;
    let getTime = [];
    quests.items?.items?.forEach((quest, index) => {
      let startTime = Date.parse(quest.createdAt)
      let endTime = Date.parse(quest.expiresAt)
      let timeLimit = endTime - startTime;
      let timeDuration = moment.duration(timeLimit*1000, 'milliseconds');
      let today = moment().utc();
      getTime.push(timeDuration);
    })
    this.setState({quests: getTime});

    this.timer = setInterval(() => {
      this.setState(({elapsedSeconds, quests}) => {
        quests = quests.map(time => time - 1000)
        return {elapsedSeconds: elapsedSeconds++, quests};
      });
    }, 1000);
  }
}

componentWillUnmount() {
  clearInterval(this.timer);
}


你的计时器功能正在改变道具(这是不好的),因为它直接改变任务,但它不会导致状态或道具的可识别更新,因此不会重新排序。类似的东西可能会起作用,如果项目中没有更多的代码,很难提供一个有用的示例,但这可能会给你一个想法

state = {
  quests: [],
  elapsedSeconds: 0,
}

componentDidUpdate(prevProps) {
  if (!prevProps.quests && this.props.quests) {
    const { quests } = this.props;
    let getTime = [];
    quests.items?.items?.forEach((quest, index) => {
      let startTime = Date.parse(quest.createdAt)
      let endTime = Date.parse(quest.expiresAt)
      let timeLimit = endTime - startTime;
      let timeDuration = moment.duration(timeLimit*1000, 'milliseconds');
      let today = moment().utc();
      getTime.push(timeDuration);
    })
    this.setState({quests: getTime});

    this.timer = setInterval(() => {
      this.setState(({elapsedSeconds, quests}) => {
        quests = quests.map(time => time - 1000)
        return {elapsedSeconds: elapsedSeconds++, quests};
      });
    }, 1000);
  }
}

componentWillUnmount() {
  clearInterval(this.timer);
}


可能您的
MapStateTops
功能未正确连接到
connect
。请用Redux绑定发布整个组件。很抱歉,我的意思是我在render上调用它时已经得到了数据,但是当我把它放在componentdidmount中时,我得到了未定义的数据。对不起,我说的是英语。可能您的
mapstatetops
功能没有正确连接到
connect
。请用Redux绑定发布整个组件。很抱歉,我的意思是我在render上调用它时已经得到了数据,但是当我把它放在componentdidmount中时,我得到了未定义的数据。对不起我的英语。