我有一个自定义组件,需要访问我的一个实际组件状态(行)。 我在构造函数中定义了它,但是当它应该被渲染时,this.state似乎总是空的,我不知道为什么......
控制台始终显示"未定义this.state"。
这是我的代码:
export class TableContainer extends React.Component<any, any> {
constructor(props : any, context: any) {
super(props,context);
this.state = {
rows:[
{ id: 1, title: 'John', count: 32 },
{ id: 2, title: 'Carl', count: 18 },
{ id: 3, title: 'Mike', count: 25 }
]
};
}
rowGetter(i: number) {
if(this.state) {
console.log('defined this.state');
return this.state.rows[i];
}
else {
console.log('undefined this.state');
return {};
}
}
render() {
return (
<div id="events-container">
<ReactDataGrid
columns={this.state.columns}
rowGetter={this.rowGetter}
rowsCount={this.state.rows.length}
minHeight={500}
/>
</div>
);
}
}
我是新人,所以可能是一个小错误。 我必须准确地说rowsCount得到了好的&#34; this.state.rows.length&#34;在渲染功能中。
先谢谢你
答案 0 :(得分:3)
在此表达式rowGetter={this.rowGetter}
中,您将方法传递给ReactDataGrid
组件。
然后它在内部调用rowGetter
,javascript函数以这种方式工作,这个函数this
链接到调用对象。
这意味着您必须以某种方式将rowGetter
方法绑定到组件实例,以便将this
链接到它。
有几种方法:
{this.rowGetter.bind(this)}
- 因为每次创建功能都缺乏效率this.rowGetter = this.rowGetter.bind(this)
- 详细方式rowGetter
方法重写为箭头功能 - 我认为这是最好的方法。它看起来像这样:
rowGetter = (i: number) => {
if(this.state) {
console.log('defined this.state');
return this.state.rows[i];
}
else {
console.log('undefined this.state');
return {};
}
}
&#13;
现在this
链接到父上下文,这是您的组件实例 - 正是您需要的。
答案 1 :(得分:1)
正在从另一个上下文调用该函数。你将bind
函数置于正确的上下文中:
rowGetter={this.rowGetter.bind(this)}
或通过&#34;胖箭&#34;:
宣布该功能rowGetter = (i: number) => {
if(this.state) {
console.log('defined this.state');
return this.state.rows[i];
}
else {
console.log('undefined this.state');
return {};
}
}
答案 2 :(得分:1)
您需要在构造函数中将方法绑定到此:
constructor(props : any, context: any) {
super(props,context);
this.state = {
rows:[
{ id: 1, title: 'John', count: 32 },
{ id: 2, title: 'Carl', count: 18 },
{ id: 3, title: 'Mike', count: 25 }
]
};
this.rowGetter = this.rowGetter.bind(this);
}
答案 3 :(得分:1)
你可以有2个选择。
使用bind(this)
this.rowGetter.bind(this)
2.使用箭头功能,然后您不想使用 bind