在我的应用程序内部,我有一个如下组件:
import React, {Component} from 'react'
import {View, Text, FlatList, TouchableOpacity} from 'react-native'
export default class Screen extends Component {
constructor(props) {
super(props);
this.state = {
selected: null
}
}
renderText(item, index) {
return (
<TouchableOpacity
style={{
borderWidth: 1,
borderColor: '#bbbbbb',
backgroundColor: this.state.selected == index ? 'blue' : 'white',
marginTop: index == 0 ? 0 : 10
}}
onPress={() => {
this.setState({selected: index})
}}
>
<Text style={{padding: 10}}>{item.text}</Text>
</TouchableOpacity>
)
}
renderArray() {
return (
<FlatList
data={this.props.data}
renderItem={({item, index}) => this.renderText(item, index)}
keyExtractor={(item, index) => index.toString()}
/>
)
}
render() {
return (
<View style={{margin: 10}}>
{this.renderArray()}
</View>
)
}
}
如您所见,我正在渲染FlatList
,对于数组中的每个项目,Text
中都有一个TouchableOpacity
组件。当您单击每个项目时,this.setState({selected: index})
会将selected
中的state
设置为该项目的索引。 this.state.selected
与TouchableOpacity
的样式有关,我希望单击某个项目时其背景会变成蓝色,但这没有发生,并且根本没有颜色变化。如果您能帮助我,我将不胜感激。
答案 0 :(得分:4)
原因是FlatList仅在this.props.data
更改时才重新渲染。您需要“提示”它,以同时监视this.state
的更改。为此,请在FlatList上设置extraData={this.state}
。参见https://facebook.github.io/react-native/docs/flatlist
答案 1 :(得分:1)
<FlatList
data={this.props.data}
renderItem={({item, index}) => this.renderText(item, index)}
keyExtractor={(item, index) => index.toString()}
extraData={this.state}
/>
通过将extraData = {this.state}传递给FlatList,我们确保当state.selected更改时FlatList本身将重新呈现。如果不设置此道具,FlatList将不知道它需要重新渲染任何项目,因为它也是PureComponent,并且道具比较不会显示任何更改。