可以在 JSX 中以相反的方式呈现组件吗?

Posted

技术标签:

【中文标题】可以在 JSX 中以相反的方式呈现组件吗?【英文标题】:Possible to render components in reverse manner in JSX? 【发布时间】:2022-01-08 12:14:06 【问题描述】:

在我的 Nextjs/React.js 组件中,我正在呈现这样的卡片列表:

      <div className="grid grid-cols-1 lg:grid-cols-12 gap-12">
    <div className="lg:col-span-8 col-span-1">
      posts.map((post, index) => (
        <PostCard post=post.node key=post.title />
      ))
    </div>

我想知道是否可以以相反的方式呈现这些明信片;从最后一个索引而不是初始索引开始?这适用于我的博客应用程序,每当我发布新的 PostCard 时,我都希望将最新的帖子呈现在列表顶部而不是列表底部。

【问题讨论】:

【参考方案1】:

只需先反转数组:

posts.slice(0).reverse().map((post, index) => (
    <PostCard
        post= post.node  
        key= post.title  
    />
))

【讨论】:

【参考方案2】:

每当我发布新的明信片时,我都希望将最新的帖子呈现在列表顶部而不是列表底部。

如果您当前通过添加到数组的末尾来执行此操作,则可以改为添加到数组的开头。例如,如果你这样做:

setPosts(prev => [...prev,  title: 'My New Post' ]);

改为这样做:

setPosts(prev => [ title : 'My New Post' , ...prev]);

如果您无法更改数组的创建方式(例如,因为某些组件希望它以一种顺序排列,而另一些则需要另一种顺序),那么您可以按正确的顺序创建一个新数组,然后映射该数组.如果数组不会经常更改,您可能需要记住这一点:

const reorderedPosts = useMemo(() => 
  return [...posts].reverse();
, [posts]);

// ...
reorderedPosts.map((post, index) => (
  <PostCard post=post.node key=post.title />
))

这也可以很容易地增强,让您可以通过状态更改订单,如果您需要:

const [shouldReverse, setShouldReverse] = useState(false);
const reorderedPosts = useMemo(() => 
  if (shouldReverse) 
    return [...posts].reverse();
   else 
    return posts;
  
, [posts, shouldReverse])

// ...
reorderedPosts.map((post, index) => (
  <PostCard post=post.node key=post.title />
))

【讨论】:

以上是关于可以在 JSX 中以相反的方式呈现组件吗?的主要内容,如果未能解决你的问题,请参考以下文章

呈现 JSX 的函数与在另一个组件中声明组件的函数有啥区别?

Vue - 如何在 Vue 组件中呈现 HTML

无法在 JSX 中呈现布尔值?

我可以在 Angular / Angular Material 中以编程方式移动 mat-h​​orizo​​ntal-stepper 的步骤吗

在 Magnolia CMS 中以编程方式呈现模板区域

在 iOS 10 中以模态方式呈现新 VC 时崩溃