#react-native #react-native-flatlist
#react-native #react-native-flatlist
Вопрос:
Я визуализирую данные, полученные из ответа api. Я хочу иметь возможность сравнивать текущую отображаемую строку с последней.
Пример: сравнение дня элемента с последним элементом. чтобы иметь возможность вставлять разделитель дня. это всего лишь простой пример того, что я пытаюсь сделать.
//data
const array = [
{day: '3/14', name: 'item1'},
{day: '3/14', name: 'item2'},
{day: '3/14', name: 'item3'},
{day: '3/15', name: 'item4'}
]
если наступит новый день, я вставлю разделитель. цель состоит в том, чтобы сгруппировать данные по дням.
let lastDay = null;
renderRows(item, index) {
//conditions
let day = item.day;
if(day != lastDay) daySeparator = true;
//store last day
lastDay = day;
return (
<ListItem noIndent style={style.listRow}>
<Row style={[style.tableRow,{alignItems: 'center'}]}>
<Text>{item.name}</Text>
</Row>
</ListItem>
);
}
Моя проблема в том, что renderRows работает не так, как для циклов, он отображает каждый элемент как отдельный, не имея возможности отслеживать предыдущие отображаемые элементы.
возможно ли сделать это таким образом, или мне нужно манипулировать массивом перед передачей его в RenderRows? если да, то какой наиболее оптимальный способ сделать это, foreach? для цикла?
Комментарии:
1. Может быть, вы могли бы просто вызвать
renderRows()
с длиной вашего списка. Еслиlength === index
вы не отображаете разделитель2. @Milore Я пытаюсь сгруппировать элемент по тому же дню. и добавьте разделитель между ними, я изменил свой вопрос, добавив пример массива, который лучше объяснит, что я пытаюсь сделать.
Ответ №1:
Теперь, когда ваш вопрос более ясен, я могу предложить вам использовать что-то вроде <SectionList>
(см. документ). Чтобы использовать SectionList
, вы должны передать ему разделенный массив. С опубликованной вами структурой данных я бы группировал элементы по дням:
const array = [
{ day: "3/14", name: "item1" },
{ day: "3/14", name: "item2" },
{ day: "3/14", name: "item3" },
{ day: "3/15", name: "item4" }
];
const grouped = array.reduce(
(result, item) => ({
...result,
[item["day"]]: [...(result[item["day"]] || []), item]
}),
{}
);
const sectionedList = Object.keys(grouped).map(item => ({
title: item,
data: grouped[item]
}));
Что даст вам следующую структуру:
[
{
title: "3/14",
data: [
{ day: "3/14", name: "item1" },
{ day: "3/14", name: "item2" },
{ day: "3/14", name: "item3" }
]
},
{
title: "3/15",
data: [{ day: "3/15", name: "item4" }]
}
];
Теперь вы можете использовать его в <SectionList>
, например:
<SectionList
renderItem={({item, index, section}) => {...}}
renderSectionHeader={({section: {title}}) => (
<Text style={{fontWeight: 'bold'}}>{title}</Text>
)}
sections={sectionedList}
keyExtractor={(item, index) => item index}
/>
Таким образом, вы можете все правильно настроить.
Я действительно надеюсь, что это могло бы вам помочь!
Ответ №2:
Один из вариантов — создать новый массив с map из вашего исходного массива. Надеюсь, это поможет вам в правильном направлении 🙂
const array = [1, 2, 3, 4]
export default class App extends React.Component {
render() {
const newArr = array.map ((item, idx) => {
const newItem = idx === array.length - 1 ? 'Gotta keep them separated' : item
return <Text>{newItem}</Text>
})
return (
<View>
{newArr}
</View>
);
}
}
Вот рабочая закуска для выставки
Комментарии:
1. если я использую .map, должен ли я удалить элемент отображения FlatList и просто отображать напрямую. или я должен поместить его во FlatList после? я рассматриваю производительность, делает ли FlatList что-то особенное с точки зрения производительности?
2. Я не могу точно сказать о производительности, но, по крайней мере, с FlatList у вас есть способы улучшить ее (например, getItemLayout). Я обновил выставку , чтобы показать, что вы могли бы использовать этот подход (map).