繁体   English   中英

react-native 如何在“触摸”后更改在 FlatList 中呈现的项目的样式?

[英]react-native How to change an item's style rendered in FlatList after "touch" it?

我想在 FlatList 中更改项目的样式,例如 color 或 fontSize,我检查了一些问题,例如this onethis one ,但它们在我的代码中不起作用。 如果我使用循环而不是 FlatList 我可以成功地更改项目的样式..

这是我的代码


let jobCategory= [
    {
        "id": "a",
        "name": "1",
    },
    {
        "id": "b",
        "name": "2",
    },
    {
        "id": "c",
        "name": "3",
    },
    {
        "id": "d",
        "name": "4",
    },
    {
        "id": "e",
        "name": "5",
    },
    {
        "id": "f",
        "name": "6",
    },
]


const styles = StyleSheet.create({
    categoryUnselectedStyle: {
        paddingTop: pxToDp(25),
        paddingBottom: pxToDp(25),
        paddingRight: pxToDp(30),
        paddingLeft: pxToDp(30),
        backgroundColor: '#f4f6f7',
    },
    categoryselectedStyle: {
        backgroundColor: 'white',
    },
    categoryTextUnselectedStyle: {
        color: '#666666',
        fontSize: pxToDp(28)
    },
    categoryTextselectedStyle: {
        color: 'lightblue',
        fontSize: pxToDp(40),
    },
});


const JobExpectPage = (props) => { 
    const [categorySelected, setCategorySelected] = useState("")


        const renderJobCategory = ({ item }) => {
        return (
            <TouchableOpacity
                key={item.id}
                onPress={() => setCategorySelected(item.id)}
                style={[styles.categoryUnselectedStyle, categorySelected == item.id && styles.categoryselectedStyle]}
            >
                <View>
                    <Text style={[styles.categoryTextUnselectedStyle, categorySelected == item.id && styles.categoryTextselectedStyle]}> {item.name}</Text>
                </View>
            </TouchableOpacity>
        )
    }




    return (
        <View> 
            <FlatList 
                data={jobCategory}
                renderItem={renderJobCategory}

        </View>

    )
}

我希望在我按下 item 后,它的样式会改变。 没有 FlatList 我已经成功了,我怎么能用 FlatList 做到呢?

这里的问题是 flatlist 没有重新渲染,因为array jobCategory总是相同的。

您必须将属性 extraData 添加到 flatlist 并传递 categorySelected 钩子,因此 flatlist 知道当 categorySelected 更改时,它必须重新渲染,请执行以下操作:

 return (
        <View> 
            <FlatList 
                data={jobCategory}
                renderItem={renderJobCategory}
                extraData={categorySelected}
        </View>

    )

通过将 extraData={categorySelected 传递给 FlatList,我们确保当 categorySelected 更改时,FlatList 本身将重新呈现。 如果没有设置这个 prop,FlatList 不会知道它需要重新渲染任何项目,因为它也是一个 PureComponent,并且 prop 比较不会显示任何更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM