Итак, я представляю ListView с двумя столбцами элементов. Следующая функция отображает строки, renderRow (rowData):Как я могу обновить состояние после нажатия на кнопку TouchableOpacity в React Native?
Для каждого элемента, если щелкнуть, я хочу, чтобы он был изменен на непрозрачность 0,5, и если щелкнуть его снова, попробуйте вернуться, чтобы очистить непрозрачность, поэтому то, что я думал, устанавливает его непрозрачность 1,0.
Я попытался следующие, но по какой-то причине непрозрачности не обновляется:
constructor(props){
super(props);
this.state = {
opacity: 1.0,
selected: false,
}
}
renderRow(rowData){
return (
<View style={styles.item}>
<TouchableHighlight onPress={()=>this._selected() underlayColor='transparent'}>
<View style={{opacity:this.state.opacity}}>
<Text>{rowData.firstName}</Text>
<Text>{rowData.lastName}</Text>
</View>
</TouchableHighlight>
</View>
)
}
_selected(){
if(this.state.selected){
console.log('ITEM HAS BEEN UNSELECTED')
this.setState({
opacity: 1.0,
selected: false
})
}else{
console.log('ITEM HAS BEEN SELECTED')
this.setState({
opacity: 0.5,
selected: true
})
}
}
Почему не непрозрачности обновляется один раз нажал и перерисовка вид внутри TouchableHighlight? Также как я могу сделать это с помощью отдельного элемента, с каждыми «непрозрачностью» и «выбранными» состояниями?
** ПОЛНЫЙ КОД
'use strict';
import React, { Component } from 'react';
import {
StyleSheet,
Text,
View,
ListView,
Image,
TouchableHighlight,
TouchableOpacity
} from 'react-native';
class Interest extends Component {
constructor(props){
super(props);
var ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
this.state = {
selected: false,
dataSource: ds.cloneWithRows([
{firstName: 'Johnny', lastName: 'Boy'},
{firstName: 'Shawn', lastName: 'Ke'},
{firstName: 'An', lastName: 'Twon'}
};
}
renderRow(rowData){
return (
<View style={this.state.selected ? styles.transItem : styles.opacItem}>
<TouchableHighlight
onPress={() => { this.setState({selected: !this.state.selected})}} underlayColor='transparent'>
<View>
<Text>{rowData.firstName}</Text>
<Text>{rowData.lastName}</Text>
</View>
</TouchableHighlight>
</View>
)
}
render() {
return (
<View style={styles.container}>
<ListView contentContainerStyle={styles.list} dataSource={this.state.dataSource} renderRow={this.renderRow.bind(this)}
/>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1
},
list: {
flexDirection: 'row',
flexWrap: 'wrap',
},
opacItem: {
margin: 15,
width: 155,
height: 175,
opacity: 1.0
},
transItem: {
margin: 15,
width: 155,
height: 175,
opacity: 0.5
}
});
export default Interest
Я сделал попытку, но, к сожалению, все еще не обновляет состояние когда-то нажал. Я обновил исходное сообщение с новой реализацией в рамках ** NEW EDIT. Все это имеет смысл, но до сих пор не знает, почему это не сработает. –
Просто проверьте, не видели ли вы мое предыдущее сообщение. Пожалуйста, дайте мне знать. –
@JoKo ответить обновлено – Kuf