reactjs - 如何使用钩子和功能组件更改 flatList 中仅一项的样式
问题描述
我正在尝试使用钩子和功能组件来实现一个简单的 flalist。我希望单击的项目突出显示,如果有另一个项目已经突出显示,我希望它被取消突出显示。我得到一个虚拟数据,其中第一项已从对象数组中选择为
const CategoriesData = [
{
id : "1",
image : require("../images/pizza-icon.png"),
title : "Pizza",
selected : true,
},
{
id : "2",
image : require("../images/shrimp-icon.png"),
title : "Sea Food",
selected : false,
},
{
id : "3",
image : require("../images/soda-icon.png"),
title : "Drinks",
selected : false,
},
{
id : "4",
image : require("../images/pizza-icon.png"),
title : "Pizza",
selected : false,
},
{
id : "5",
image : require("../images/shrimp-icon.png"),
title : "Sea Food",
selected : false,
},
{
id : "6",
image : require("../images/soda-icon.png"),
title : "Drinks",
selected : false,
},
]
export default CategoriesData;
我已将平面列表作为组件包含到类组件中
export default class App extends React.Component {
state = {
fontsLoaded : false
}
loadfonts = async() => {
await Font.loadAsync(customFonts)
this.setState({fontsLoaded : true})
}
componentDidMount(){
this.loadfonts()
}
componentWillUnmount(){
this.setState({fontsLoaded: false})
}
render(){
//console.log(colors.secondary)
if(this.state.fontsLoaded)
{
return(
<View style = {styles.container}>
<ScrollView contentContainerStyle= {{paddingBottom : 20}} nestedScrollEnabled = {true}>
<CategoriesList/>
</ScrollView>
<StatusBar style="dark" />
</View>
)
}
else
{
return (
<Apploading/>
)
}
}
}
有问题的平面列表如下,虽然我让它在点击时突出显示并在另一次点击时突出显示但似乎无法理解我需要的逻辑,因此当我点击另一个项目时,之前突出显示的项目被删除
const CategoriesList = ()=> (
<View style = {styles.categoriesListContainer}>
<FlatList
contentContainerStyle={{ paddingRight :120, /*backgroundColor : "blue",*/ }}
data = {categoriesData}
renderItem = {(object) => <RenderCategories data = {object}/>}
//keyExtrator = {(item,index) => index.toString()}
horizontal = {true}/>
</View>
)
const RenderCategories = (obj) => {
//console.log(obj.data.item)
const[selected, setSelected] = useState(obj.data.item.selected)
const[selectedId, setSelectedId] = useState(1)
//const[dataupdated, setDataUpdated] =useState(false)
//const [previousId, setPreviousId] = useState(null)
//const[flag, setFlag] = useState(false)
// console.log("previousID in function:", previousId)
// console.log("selectedId in function:", selectedId)
// console.log("selected in function:", selected)
// console.log("obj.id in function:", obj.data.item.id, "\n\n")
const onPress = (id)=> {
console.log("selected : ", selected)
console.log("selectedID :", id)
//setPreviousId(selectedId)
setSelected(previous=> !previous)
setSelectedId(id)
}
// useEffect(()=> {
// //setDataUpdated(previous => !previous)
// }, [selected, selectedId])
return (
<TouchableOpacity onPress = {()=>onPress(obj.data.item.id)}>
<View style = {[styles.listItems, {backgroundColor : selected ? colors.primary : "#fff"}]} key = {obj.data.item.id}>
<Image resizeMode = "stretch" source = {obj.data.item.image} style = {styles.listItemImage}/>
<Text style = {styles.listItemTitle}>{obj.data.item.title}</Text>
<View
style = {[styles.iconwrapper, {backgroundColor : selected ? "#fff" : colors.secondary}]}>
<Feather name = "chevron-right" size = {8}
style = {[styles.categoryiconselect, {backgroundColor : selected ? "#fff" : colors.secondary}]}/>
</View>
</View>
</TouchableOpacity>
)
}
解决方案
推荐阅读
- c - 在 for 循环中有效地打印每 x 次迭代
- android - 用户关闭位置权限后,如何在 Android 10 中再次请求位置权限?
- jenkins - Jenkins 在拉取图像时添加了私有注册 URL 标签
- swiftui - 如何在 SwiftUI 中显示文本 2 秒然后将其隐藏?
- java - 如何使用具有多个对象类型(如字符串、对象、布尔值)的“回复”之类的单个键。我正在尝试解析它以填充 Recyclerview
- python - 使用带有 tkinter 的 Telethon 连接到电报而不冻结 GUI
- kubernetes - 在 Traefik Kubernetes Ingress 中打开 HTTP 和 HTTPS 以外的其他端口
- github - 如何删除没有设置图标的 GitHub 存储库
- python - 全局“关键位置”变量上的 NameError 和 ax.cla() 主要减慢速度 - Matplotlib,Python
- r - 如何强制在 R 中显示所有 y 轴值?