我的RNNv2顶部栏中有一个自定义组件“ MenuButton”。我希望单击该按钮时运行openMenu(),但这不会发生。我的打字稿掉毛告诉我Property openMenu does not exist on typeof Home
。为什么是这样?
class Home extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
Navigation.events().bindComponent(this);
}
closeMenu = () => {
this._drawer.close();
};
openMenu = () => {
this._drawer.open();
};
static options(passProps) {
return {
topBar: {
rightButtons: [
{
component: {
name: 'MenuButton',
passProps: {
onClick: () => this.openMenu(),
},
},
},
],
},
};
}
render() {
return (
...
);
}
}
参考我从https://github.com/wix/react-native-navigation/issues/3648获得了
passProps
代码 最佳答案
openMenu
是实例方法,而static options(passProps)
显然是静态方法。
您的onClick
是通过箭头功能(例如() => this.openMenu()
)定义的,这意味着它被迫使用静态上下文。
尽管https://github.com/wix/react-native-navigation/issues/3648#issuecomment-408680892建议使用箭头功能,但我认为它不起作用。
您必须以某种方式向MenuButton
提供Home组件的实例。
最肮脏的骇客如下:
let homeInstance: Home | undefined;
class Home extends React.PureComponent<Props, State> {
constructor(props: Props) {
super(props);
Navigation.events().bindComponent(this);
homeInstance = this;
}
closeMenu = () => {
this._drawer.close();
};
openMenu = () => {
this._drawer.open();
};
static options(passProps) {
return {
topBar: {
rightButtons: [
{
component: {
name: 'MenuButton',
passProps: {
onClick: () => {
if(homeInstance) {
homeInstance.openMenu()
} else {
console.warn("homeInstance is not initialised");
}
},
},
},
},
],
},
};
}
render() {
return (
...
);
}
}
我们这里有一种单例,因此它不是一个完美的解决方案。我会尝试使用React.Context来改善它