gpt4 book ai didi

react-native - 如何按组显示日期,例如 Whatsapp 聊天屏幕?

转载 作者:行者123 更新时间:2023-12-03 17:12:09 24 4
gpt4 key购买 nike

我怎样才能像 Whatsapp 聊天屏幕中的那样精确地做一个类似的日期系统?

如您所见,消息按日期分组,我的意思是它们按日期分隔。

这是我找到的屏幕截图,以便更好地解释:

Example

我在 FlatList 中执行此操作,同时一一呈现消息。

这是我所做的

        let previousDate = "";
if (index > 0) {
previousDate = moment(this.state.messages[index - 1].created_at).format(
"L"
);
} else {
previousDate = moment(this.state.messages.created_at).format("L");
}

let currentDate = moment(item.created_at).format("L");

所以,我为 renderItem 创建了一个功能组件FlatList 的 Prop ,所以 itemindex来自 FlatList 的实际数据。

我在这里要做的是,基本上抓取当前渲染项的 created_at并将其与上一项的 created_at 进行比较,为此,我正在使用存储在状态中的原始数据。但不幸的是,当 FlatList 呈现索引号为 0 的第一个项目时状态中的原始数据中没有前一个元素要比较,这就是为什么我检查是否大于 0 并从前一个索引项中获取日期。而在 Else 情况下,这意味着在渲染第一个项目时,不要查找前一个项目而只获取 created_at .

下面我检查 currentDatepreviousDate s 不相同,呈现自定义组件,否则不呈现任何内容。
    {previousDate && !moment(currentDate).isSame(previousDate, "day") ? ( // custom component) : null}

它应该像那样工作,但主要问题是,我使用了 inverted FlatList 用于消息从屏幕底部到顶部。但是现在,因为它是一个倒置的平面列表,从底部到顶部渲染的项目,它给了我这样的结果:

enter image description here

注意:一开始,消息也被反转了,但我通过发送它们也从数据库中反转来解决了这个问题。

所以,我不知道我如何才能实现我的目标,并像第一张图片一样做到这一点。

谢谢!

最佳答案

我使用辅助函数 ( generateItems ) 来解决您所描述的问题。这是我用来按天对消息进行分组然后呈现 <Message /> 的代码或 <Day />renderItem支柱。这是使用 inverted FlatList正如你所描述的。

import moment from 'moment';

function groupedDays(messages) {
return messages.reduce((acc, el, i) => {
const messageDay = moment(el.created_at).format('YYYY-MM-DD');
if (acc[messageDay]) {
return { ...acc, [messageDay]: acc[messageDay].concat([el]) };
}
return { ...acc, [messageDay]: [el] };
}, {});
}

function generateItems(messages) {
const days = groupedDays(messages);
const sortedDays = Object.keys(days).sort(
(x, y) => moment(y, 'YYYY-MM-DD').unix() - moment(x, 'YYYY-MM-DD').unix()
);
const items = sortedDays.reduce((acc, date) => {
const sortedMessages = days[date].sort(
(x, y) => new Date(y.created_at) - new Date(x.created_at)
);
return acc.concat([...sortedMessages, { type: 'day', date, id: date }]);
}, []);
return items;
}

export default generateItems;
引用这里是我的 list 以及 renderItem功能:
<MessageList
data={generatedItems}
extraData={generatedItems}
inverted
keyExtractor={item => item.id.toString()}
renderItem={renderItem}
/>

function renderItem({ item }) {
if (item.type && item.type === 'day') {
return <Day {...item} />;
}
return <Message {...item} />;
}

关于react-native - 如何按组显示日期,例如 Whatsapp 聊天屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61237564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com