望ましい動作は、console.logのonClickハンドラーに引数(テキスト)を渡すことですが、構文に何か問題があるようです。
以下のように引数を省略した場合、それはうまく機能しています:
export default class Nav extends Component {
componentDidMount() {
this.props.pickNumber(3);
}
onPress() {
console.log('FOOOBAAR');
}
render() {
return (
<View>
<Text>####################</Text>
<Text>Intro Screen</Text>
<Text>Number: {this.props.numbers}</Text>
<TouchableHighlight onPress={this.onPress.bind(this)}>
<Text>Go to Foo</Text>
</TouchableHighlight>
</View>
);
}
}
ただし、onPressハンドラに引数を渡したい場合は、「未定義のプロパティ「バインド」を読み取れません」というメッセージが表示されます。
export default class Nav extends Component {
componentDidMount() {
this.props.pickNumber(3);
}
onPress(txt) {
console.log(txt);
}
render() {
return (
<View>
<Text>####################</Text>
<Text>Intro Screen</Text>
<Text>Number: {this.props.numbers}</Text>
<TouchableHighlight onPress={this.onPress('foo').bind(this)}>
<Text>Go to Foo</Text>
</TouchableHighlight>
</View>
);
}
}
ありがとう
追加:変更する場合:
onPress={this.onPress.bind('foo')}
それも機能しません。
ES6を使用して、コンストラクターでバインディングを実行できます。
export default class Nav extends Component {
constructor(props) {
super(props);
this.onPress = this.onPress.bind(this);
}
その後
onPress(txt) {
console.log(txt);
}
render() {
return (
<View>
<Text>####################</Text>
<Text>Intro Screen</Text>
<Text>Number: {this.props.numbers}</Text>
<TouchableHighlight onPress={() => this.onPress('foo')}>
<Text>Go to Foo</Text>
</TouchableHighlight>
</View>
);
}
}
OnPress値でバインドし、「this」の後に引数を渡すことで、コンストラクターで関数をバインドすることを回避できます。コンストラクターのパターンは問題ありませんが、OOの土地に行くほど面倒に感じます。そのようにコードをリファクタリングできますが、
export default class Nav extends Component {
componentDidMount() {
this.props.pickNumber(3);
}
onPress(txt) {
console.log(txt); // foo
}
render() {
return (
<View>
<Text>####################</Text>
<Text>Intro Screen</Text>
<Text>Number: {this.props.numbers}</Text>
<TouchableHighlight onPress={this.onPress.bind(this,'foo')}>
<Text>Go to Foo</Text>
</TouchableHighlight>
</View>
);
}
}
最初の引数は「this」であり、その後に同じ順序で受信される他の引数を指定できます。
太い矢印でも解決できます:
export default class Nav extends Component {
handlePress = (text) => {
console.log(text);
}
render() {
return (
<View>
<Text>####################</Text>
<Text>Intro Screen</Text>
<Text>Number: {this.props.numbers}</Text>
<TouchableHighlight onPress={() => this.handlePress('weeeeee')}>
<Text>Go to Foo</Text>
</TouchableHighlight>
</View>
);
}
}
関数を呼び出す前に、太い矢印関数を1つ渡すだけです。
onPress= {()=> this.handlePress(param)}