如何切换我的 flatList 中的文本项?

How can I toggle text items in my flatList?

我想切换 flatList 中的文本项,这里是 what I have so far。问题是我不知道如何关闭之前的选择。 我如何修改我的 expo 小吃示例来做到这一点? 明确地说,我想一次选择一个项目,而不是多个,目前它是多个。重要的是,我的 FlatListItem 与 FlatList 容器保持分离(在它自己的组件中)。在我的实际项目中,这是设置,因为我的 FlatListItem 包含许多 if 语句和样式。所以为了保持整洁,我将两者分开,以防万一你想知道为什么两者分开。

import * as React from 'react';
import { FlatList, Text, View, StyleSheet, Pressable } from 'react-native';
import FlatListItem from './components/FlatListItem'



export default function App() {
  
const renderItem = ({item}) => <FlatListItem text={item.text} />
    
const data = [
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 0
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 1
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 2
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 3
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 4
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 5
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 6
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 7
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 8
  },
  {
    text:"Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
    key: 9
  },
]

  return (
    <View style={styles.container}>
      <FlatList
      horizontal={false}
      data={data}
      renderItem={renderItem}
      contentContainerStyle={{ marginHorizontal: 10 }}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
 
});
import * as React from 'react';
import {View, Text, Pressable} from 'react-native';

const flatListItem = (props) => {
const [selectText, setSelectText] = React.useState(false)

const selectionStyle = (isTextSelected) => {
      if (isTextSelected) {
        return { backgroundColor: "red", marginVertical: 10 };
      } else {
        return { marginVertical: 10};
      }
    };

return <Pressable onPress={() => selectText ? setSelectText(false) : setSelectText(true)} >
<Text style={selectionStyle(selectText)}>{props.text}</Text>
</Pressable>
}

export default flatListItem

既然你想要一个选择,你需要在父级管理状态,平面列表呈现的地方,因为我们不能依赖平面列表项状态来进行选择。我稍微更新了你的代码,这应该可以工作

import * as React from 'react';
import { FlatList, Text, View, StyleSheet, Pressable } from 'react-native';
import FlatListItem from './components/FlatListItem'



export default function App() {
  const [selectedIndex, setSelectedIndex] = React.useState(null);//keep track of selection
  const renderItem = ({ item }) => <FlatListItem selected={selectedIndex === index.key} onSelect={onSelectItem} text={item.text} id={item.key} />
/* We will toggle the selection here */
  const onSelectItem = id => {
    if (id === selectedIndex) return setSelectedIndex(null)
    setSelectedIndex(id)
  }
  const data = [
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 0
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 1
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 2
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 3
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 4
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 5
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 6
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 7
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 8
    },
    {
      text: "Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah Blah ",
      key: 9
    },
  ]

  return (
    <View style={styles.container}>
      <FlatList
        horizontal={false}
        data={data}
        renderItem={renderItem}
        contentContainerStyle={{ marginHorizontal: 10 }}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    backgroundColor: '#ecf0f1',
    padding: 8,
  },

});
import * as React from 'react';
import { View, Text, Pressable } from 'react-native';

const flatListItem = (props) => {

  const selectionStyle = (isTextSelected) => {
    if (isTextSelected) {
      return { backgroundColor: "red", marginVertical: 10 };
    } else {
      return { marginVertical: 10 };
    }
  };

  return <Pressable onPress={() => props.onSelect(props.id)} >
    <Text style={selectionStyle(props.selected)}>{props.text}</Text>
  </Pressable>
}

export default flatListItem