我不确定我做错了什么,但我的组件中有一些功能。但是,我无法将其中一个函数作为道具传递,我收到this.nextScene
不是函数。
这是我的组件的片段,我已经评论了我遇到问题的地方:
nextScene() {
this.refs.navigator.push('browse');
}
renderNavigationView() {
return (
<View style={styles.drawer}>
<Touchable
onPress={this.nextScene()} //issue here, "this.nextScene is not a function"
>
<View style={styles.container}>
<Text style={styles.title}>Browse</Text>
</View>
</Touchable>
<Touchable>
<View style={styles.container}>
<Text style={styles.title}>Button</Text>
</View>
</Touchable>
</View>
);
}
render() {
return (
<DrawerLayoutAndroid
ref="drawer"
drawerWidth={300}
drawerPosition={DrawerLayoutAndroid.positions.Left}
renderNavigationView={this.renderNavigationView}>
<Navigator
ref="navigator"
configureScene={(route) => {
if (Platform.OS === 'android') {
return Navigator.SceneConfigs.FloatFromBottomAndroid;
}
} }
initialRoute={{}}
renderScene={this.renderScene}
/>
</DrawerLayoutAndroid>
);
}
谢谢!
答案 0 :(得分:3)
如果你看一下你正在渲染的组件,并在renderNavigationView
道具:
renderNavigationView={this.renderNavigationView}
似乎很好,但由于默认情况下函数中的this
上下文为window
,this
引用window
中的renderNavigationView
。考虑一下您的onPress
事件处理程序:
onPress={this.nextScene()}
由于您在函数中使用this.nextScene()
且this
引用window
,因此您有效地尝试执行不存在的window.nextScene
,从而抛出错误。 (另请注意,这是一个调用 - 而不是引用。删除括号)。
因此,如果我尝试
this.nextScene.bind(this)
,我会得到cannot read property 'bind' of undefined
这是因为函数未定义,因为window.nextScene
不存在。要解决此问题,请使用Function.prototype.bind
正确绑定this
renderNavigationView
和nextScene
:
renderNavigationView={this.renderNavigationView.bind(this)}
在这种情况下bind
的作用是在函数中设置this
上下文。由于this
这里引用了类,因此该类将用于执行应该正常工作的nextScene
方法。您还必须在nextScene
上使用绑定,因为在nextScene
内我们希望this
引用类,而不是window
:
onPress={this.nextScene.bind(this)}
答案 1 :(得分:1)
使用冬天在他的回答中指出的绑定方法的另一种方法是使用箭头函数自动将this
绑定到父上下文。
class MyComponent extends React.Component {
clickHandler = (e) => {
// do stuff here
}
render() {
return (
<button onClick={this.clickHandler}></button>
)
}
}