#typescript #react-native
Вопрос:
В настоящее время у меня есть компонент, который принимает мои макетные данные из хранилища. Я могу отображать каждую страницу с динамическими данными с помощью моих макетных данных, которые хранятся в папке магазина:
mockData.ts:
{
name: 'Triggerfish',
imageSrc: require('../resource/images/ClownTriggerfish.png'),
scientificName: 'Balistidae',
diet: 'Carnivores',
maxSize: '20-100cm',
family: [
require('../resource/images/ClownTriggerfish.png'),
require('../resource/images/RedtoothTriggertish.png'),
require('../resource/images/OrangeLineTriggerfish.png'),
require('../resource/images/PicassoTriggerfish.png'),
]
},
{
name: 'Pufferfish',
imageSrc: require('../resource/images/DogFacePuffer.png'),
scientificName: 'Arothron',
diet: 'Carnivores',
maxSize: '10-120cm',
family: [
require('../resource/images/DogFacePuffer.png'),
require('../resource/images/GuineafowlPuffer.png'),
require('../resource/images/StarryPuffer.png'),
]
},
Затем у меня есть отдельный компонент, называемый BottomImages.js где я загружаю данные изображения из файла mockdata.ts. Здесь я вручную установил номер своей колонки.:
const ITEM_WIDTH = Dimensions.get('window').width / 1.2;
const BottomImages: React.FC<FamilyCarouselProps> = ({ family }) => {
const columns = 3;
const [activeItemIndex, setActiveItemIndex] = useState()
return(
<FlatList
numColumns={columns}
data={family}
renderItem={({ item }) => {
return (
<ListItem
itemWidth={(ITEM_WIDTH - (10 * 3)) / 3}
image={item.image}
itemIndex={item.id}
activeItemIndex={activeItemIndex}
onChangeActiveItemIndex={(index)=>{
setActiveItemIndex(index)
}}
/>
);
}}
/>
);
}
И мой компонент ListItem, который показывает изображения, находится ниже:
const ListItem: React.FC = (props) => {
const [background, setBackground] = useState(true);
return(
<TouchableWithoutFeedback onPress={() => setBackground(current => !current)} >
<Animated.View
style={{
margin: 5,
}}>
<View onClick={() => setBackground(current => !current)}
style={{borderWidth: background? 0:0,
borderColor: '#000',}}>
<Image
style={{
width: props.itemWidth,
resizeMode: "contain",
height: 200,
}}
source={props.image}></Image>
</View>
</Animated.View>
</TouchableWithoutFeedback>
);
}
Итак, теперь проблема в том, что для рыб с 3 изображениями в моем семейном массиве есть хорошая компоновка, где все это помещается в одну строку, но для рыб, у которых больше 3, представление искажается, и они переходят в следующую строку:
Я хочу, чтобы номер столбца менялся вместе с количеством изображений в массиве, например, если в моем массиве семейства спинорогов 4 изображения, то он должен изменить номер столбца на 4.
Комментарии:
1. Не уверен, что вы можете изменить столбец определенной строки с помощью компонента FlatList, возможно, вам придется создать пользовательский компонент списка, в котором у вас есть контроль над отдельными строками.
2. @Mohaimin Я хочу изменить не строки, а только переменную столбцов в моей BottomImages.js что я хочу измениться. В основном он должен показывать количество изображений, которые находятся в моем семейном массиве внутри mockData.ts. Например, в моем семейном массиве Triggerfish 4 изображения, поэтому столбец должен быть столбцом =4. Мой массив семейства фугу имеет 3 изображения, поэтому столбец должен быть столбцом =3 и так далее.
3. Правильно, но опора столбца устанавливается в компоненте FlatList, который, в свою очередь, задает столбец всех строк плоского списка. Итак, если у рыбы есть 4 семейства, вы бы хотели, чтобы в этой конкретной строке было 4 столбца, верно?
4. Правильно, я также хотел бы изменить ширину элемента, которая есть в списке, куда я сейчас помещаю (ITEM_WIDTH — (10 * 3)) / 3, но я хочу изменить его на (ITEM_WIDTH — (10 * столбец)) / столбец после того, как я получу конкретное число из массива. В любом случае, это возможно?