Получить ключ и элемент при нажатии TouchableOpacity, когда элементы отображаются
В приведенном ниже коде элементы отображаются правильно и работают
Но когда я нажимаю TouchableOpacity, он возвращает событие.
Я использовал JSON.stringify(event.nativeEvent), но не работает
Я хочу получить значение ключа, которое установлено на TouchableOpacity и этот элемент данных.
export default class MyLanguages extends Component {
constructor(props) {
super(props);
this.state = {
languageData: ["English","Hindi","Tamil","Telugu","Gujarati","Marathi","Panjabi"],
};
}
render() {
return (
<View style={styles.container}>
{this.state.languageData.map( (item,index) => {
return (
<TouchableOpacity key={index}
onPress={ (event)=>{
alert(event.nativeEvent)
}}>
<Text style={MyStyle.appFontStyle2}>{item}</Text>
</TouchableOpacity>
)}
)}
</View>
)
}
}
1 ответ
Решение
item
а также index
все еще находятся в сфере onPress
обратный вызов, так что вы можете обратиться к ним напрямую:
{this.state.languageData.map((item, index) => {
return (
<TouchableOpacity
key={index}
onPress={event => {
alert(`${index}: ${item}`);
}}
>
<Text style={MyStyle.appFontStyle2}>{item}</Text>
</TouchableOpacity>
);
)}
Вы также можете использовать для этого каррированные функции:
export default class MyLanguages extends Component {
constructor(props) {
super(props);
this.state = {
languageData: ["English","Hindi","Tamil","Telugu","Gujarati","Marathi","Panjabi"],
};
}
//Curried function (A function which, when invoked (with an argument), returns another function that depends on the argument
onPressHandler = key => event => {
console.log(key, event)
}
render() {
return (
<View style={styles.container}>
{this.state.languageData.map( (item,index) => {
//Invoke the curried function with the index as the argument for the key paremeter,
//which returns another function which is set as the onPress event handler
return (
<TouchableOpacity
key={index}
onPress = {this.onPressHandler(index)}
>
<Text style={MyStyle.appFontStyle2}>{item}</Text>
</TouchableOpacity>
)}
)}
</View>
)
}
}