我有我的组件类,我们称它为MyComponent
。它具有复杂的执行逻辑,但是这是省略不必要代码段的样子:
class MyComponent extends Component {
justWarn(input) {
console.warn(input);
// do something with `this` as well
}
render() {
return (
<View>
{this.props.myText}
</View>
);
}
}
const mapStateToProps = () => {
// Call the getText function here
return {
myText: getText()
};
}
export default connect(mapStateToProps)(MyComponent);
现在,函数getText
在其他文件中定义,如下所示:
function getText() {
// Let's assume it returns hard-coded value for the sake of brevity
return (
<Text>
<Text>I am the first part</Text>
<Text
onPress={function(){
// I want to call the function that is defined inside MyComponent
// since this Text will eventually be a part of MyComponent
this.justWarn('Warn me in the yellow box')
}}
>I am the clickable part
</Text>
</Text>
);
}
当我尝试从上面定义的justWarn
调用MyComponent
内部定义的Text
方法时,出现错误undefined is not a function, evaluating this.justWarn
。
我的问题是,我没有使用箭头功能,因此this
在声明onPress
处理程序时未绑定。当Text
是MyComponent
的一部分时,它实际上是被调用的,因此this
是否不对应于MyComponent
并且上面的代码应该可以正常工作?
我在这里做错了什么?通过将getText
和MyComponent
分成两个文件,有什么方法可以实现?
谢谢。
答案 0 :(得分:0)
问题是getText
没有this
上下文,因此您需要以某种方式绑定它以获得上下文。
一种实现此目的的方法是通过像这样更改MyComponent
-
class MyComponent extends Component {
justWarn(input) {
console.warn(input);
alert(input)
// do something with `this` as well
}
render() {
const myText = this.props.myText.bind(this)
return (
<View>
<Text>something should render</Text>
{myText()}
</View>
);
}
}
const mapStateToProps = () => {
// Call the getText function here
return {
myText: getText
};
}
export default connect(mapStateToProps)(MyComponent);
...
然后在像这样的onPress事件处理程序中使用箭头功能-
function getText() {
// Let's assume it returns hard-coded value for the sake of brevity
return (
<Text>
<Text>I am the first part</Text>
<Text
onPress={() => {this.justWarn('Warn me in the yellow box')}}
>I am the clickable part
</Text>
</Text>
);
}
...
希望有帮助。