我很困惑为什么本机没有看到这个函数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)),
});
}
}
}
答案 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()转换为箭头函数,作为绑定它们并将它们保留在范围内的方法。
问题解决了。