私は2列の項目でListViewをレンダリングしています。次の関数は、renderRow(rowData)という行をレンダリングします。React NativeのTouchableOpacityからonPressを一度更新するにはどうすればよいですか?
クリックすると、不透明度が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内のビューを再レンダリング更新されていませんか?また、それぞれの「不透明度」と「選択された」状態で、個々のアイテムでどのように行うことができますか?
** FULL CODE
'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