定义的函数不被视为函数

时间:2018-01-24 15:05:12

标签: reactjs react-native

我很困惑为什么本机没有看到这个函数timeToString(time)定义并在我的代码中作为函数调用。我得到一个令人讨厌的错误,该功能不是运行应用程序时的功能。请协助。感谢。

 export default class AgendaScreen extends Component {
  constructor(props) {
    super(props);
    this.state = {
      items: {},
    };
  }

  timeToString(time) {
    const date = new Date(time);
    return (
      date.toISOString().split('T')[0]
    );
  }

  loadItems(day) {
    setTimeout(() => {
      for (let i = -15; i < 85; i++) {
        const time = day.timestamp + i * 24 * 60 * 60 * 1000;
        const strTime = this.timeToString(time);
        if (!this.state.items[strTime]) {
          this.state.items[strTime] = [];
          const numItems = Math.floor(Math.random() * 5);
          for (let j = 0; j < numItems; j++) {
            this.state.items[strTime].push({
              name: `Item for ${strTime}`,
              height: Math.max(50, Math.floor(Math.random() * 150)),
            });
          }
        }
      }

红色屏幕报告错误: Error reported in red screen

4 个答案:

答案 0 :(得分:0)

与反应或反应原生无关

这只是范围问题。

不确定如何调用此方法,但应确保this正确绑定。

1:您可以提前绑定构造函数

constructor(props) {
    ...
    this.timeToString = this.timeToString.bind(this)
}

2:在呼叫本身中绑定

导出默认类AgendaScreen扩展Component {        render(){            回来(                            )        }    }

答案 1 :(得分:0)

由于您已经使用了箭头功能,因此您无需将其引用。使用箭头功能时,范围将在其中可用。

注意:仅当您使用

等常规功能时,范围才可用
setTimeout(function(){}, 1000)

所以你的代码在范围方面看起来很好。我回答的问题是你没有声明/绑定一个函数,即this.timeToString()。

所以在构造函数

中绑定你的函数
constructor(props) {
    super(props);
    this.state = {
      items: {},
    };
this.timeToString = this.timeToString.bind(this)
  }

希望这可以解决问题。

答案 2 :(得分:0)

loadItems需要适当的this

范围

您可以在构造函数this.loadItems = this.loadItems.bind(this);

中定义它

使用es7 fat arrow函数定义loadItems

loadItems = (day) => {
...
};

timeToString从不在其执行中调用this,因此不需要绑定它。

然而,我只需使用es7 fat arrow函数定义所有类函数,以便在需要时进行自动绑定。

答案 3 :(得分:0)

感谢Tzook Bar Noy,我终于找到了问题。我还需要将调用timeTO String()函数的loadItems()转换为箭头函数,作为绑定它们并将它们保留在范围内的方法。

问题解决了。