我正在映射对象数组并在卡片中显示它们的值,每个对象都有一个标题、评论和 datePosted 字段。 datePosted 字段通过我制作的函数将其显示在卡片上为“2 小时前发布”或“2 分钟前发布”。尽管每次状态发生变化,这都会更新,这在几天前甚至几小时前发布时不是问题,因为没有任何变化,但是当首次上传并保存新帖子时,显示的日期几乎每次您键入时都会更新一个键,因为它从“1秒前发布”到“2秒前发布”,再到“3秒前发布”等等......我可以做些什么来解决这个问题,我考虑过将组件保存在不同的状态并显示它,但我认为这不会起作用,因为每次用户更改标题或评论时都需要更新状态所以可以实时显示。
下面是一个 JSX 的示例,它显示了该卡,以防有帮助。 timeCalc 是计算帖子创建前多久的函数
{posts.map(item => (
<div>
<div>
<h1>{item.title}</h1>
<h3>{item.comment}</h3>
</div>
<div>
<h3>{timeCalc(item.datePosted)}</h3>
</div>
</div>
))}
我会将代码提取到其自己的组件中,然后该组件可以使用几种可能的技术之一来记住其第一次渲染的值。这是一个useMemo
:
{posts.map(item => <Post item={item}/>)}
//... elsewhere:
const Post = ({ item }) => {
const time = useMemo(() => {
return timeCalc(item.datePosted);
}, []);
return (
<div>
<div>
<h1>{item.title}</h1>
<h3>{item.comment}</h3>
</div>
<div>
<h3>{time}</h3>
</div>
</div>
);
}
记住初始值的其他可能方法是使用状态:
const Post = ({ item }) => {
// Note that i have no need for `setTime`, as this value will never be changed
const [time] = useState(timeCalc(item.datePosted));
或者使用参考:
const Post = ({ item }) => {
const timeRef = useRef(timeCalc(item.datePosted));
// ...
<h3>{timeRef.current}</h3>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)