在使用 Alpine.js 筛选行后保留 table 的斑马条纹

Retain zebra striping of table after rows are filtered with Alpine.js

我有一个 table 有斑马条纹。

我正在使用 Alpine.js 根据您单击的按钮过滤行。

过滤 table 时,行条带化来自原始的未过滤状态。

我希望在更新过滤器时重新计算条带化。

代码如下,我创建了一个 CodePen

<div x-data="{ filterID: 'all', filter: (id, allowed) => allowed.includes(id) }">
  <nav class="mb-4">
    <a
      class="bg-purple-200 hover:bg-purple-400"
      @click.prevent="filterID = 'all', striping"
      :class="{ 'bg-purple-400' : filterID === 'all' }"
      href="#"
    >All</a>
    <a
      class="bg-purple-200 hover:bg-purple-400"
      @click.prevent="filterID = 'A'"
      :class="{ 'bg-purple-400' : filterID === 'A' }"
      href="#"
    >A</a>
    <a
      class="bg-purple-200 hover:bg-purple-400"
      @click.prevent="filterID = 'B'"
      :class="{ 'bg-purple-400' : filterID === 'B' }"
      href="#"
    >B</a>
  </nav>
  
  <table>
    <thead>
      <th>Column A</th>
      <th>Column B</th>
    </thead>
    <tbody>
      <tr
        x-show.transition="filter(filterID, [ 'A' ]) || filterID === 'all'"
        :class="{ 'active': filter(filterID, [ 'A' ]) }"
        class=""
      >
        <td>Data 1A</td>
        <td>Data 1B</td>
      </tr>
      <tr
        x-show.transition="filter(filterID, [ 'B' ]) || filterID === 'all'"
        :class="{ 'active': filter(filterID, [ 'B' ]) }"
        class="bg-purple-200"
      >
        <td>Data 2A</td>
        <td>Data 2B</td>
      </tr>
      <tr
        x-show.transition="filter(filterID, [ 'A' ]) || filterID === 'all'"
        :class="{ 'active': filter(filterID, [ 'A' ]) }"
        class=""
      >
        <td>Data 3A</td>
        <td>Data 3B</td>
      </tr>      
    </tbody>
  </table>
</div>

使用 :key="row.id" 为这些项目指定特定的 ID。这样,alpine.js 将从 DOM 中删除非活动行,因此 odd/even 计数不会因行被隐藏而混乱。