npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

vue-easy-data-table

v1.7.1

Published

A customizable and easy-to-use data table component made with Vue.js 3.x. Actively maintained fork of vue3-easy-data-table.

Readme

A Vue 3 data table with sorting, search, pagination, selection, fixed columns, and slots — plus opt-in virtual rows, grouped headers, and better server-side DX.

This is an actively maintained fork of vue3-easy-data-table. 1.7.1 is drop-in compatible with upstream 1.5.x; new APIs are additive.

npm install vue-easy-data-table

Why this fork

Upstream last published in 2023. This package keeps the same component API and CSS class hooks, and ships fixes plus features that were stuck as README todos:

| 1.7.1 | What you get | | --- | --- | | Summary row | Built-in <tfoot> totals (Header.summary including length, summary-row, named computeSummaryValue export, #summary* slots); virtual stays on | | item-key | Stable row identity for selection, expand, and virtual tables (skip slow JSON.stringify) | | Virtual rows | Opt-in windowing of the current page (virtual + virtual-row-height) | | Server DX | Footer page tracks serverOptions.page; custom serverOptions fields are preserved; server-select-all | | Headers | Per-column align / className / hidden, grouped children, custom sort compare | | Sticky columns | Painted-width left and opaque stacking so scrolling cells cannot paint through frozen ones | | Accessibility | aria-sort, keyboard sort, labeled checkboxes / pagination / expand |

Vue is a peer (^3.4.0 || ^3.5.0), not bundled.

Install

npm install vue-easy-data-table
# or: pnpm add vue-easy-data-table / yarn add vue-easy-data-table

Register globally (or import per component):

import Vue3EasyDataTable from 'vue-easy-data-table';
import 'vue-easy-data-table/dist/style.css'; // required — this exact path

app.component('EasyDataTable', Vue3EasyDataTable);
// or: import { Vue3EasyDataTable as EasyDataTable } from 'vue-easy-data-table';

Types (Header, Item, ServerOptions, …) and aggregator helpers (computeSummaryValue, …) come from the package root.

Quick start

<template>
  <EasyDataTable
    :headers="headers"
    :items="items"
    item-key="name"
  />
</template>

<script setup lang="ts">
import type { Header, Item } from 'vue-easy-data-table';

const headers: Header[] = [
  { text: 'Name', value: 'name' },
  { text: 'Height (cm)', value: 'height', sortable: true },
  { text: 'Weight (kg)', value: 'weight', sortable: true },
  { text: 'Age', value: 'age', sortable: true },
];

const items: Item[] = [
  { name: 'Curry', height: 178, weight: 77, age: 20 },
  { name: 'James', height: 180, weight: 75, age: 21 },
  { name: 'Jordan', height: 181, weight: 73, age: 22 },
];
</script>

Copy-paste patterns (search, selection, server mode, virtual, grouped headers): docs/RECIPES.md.
Full props / slots / emits / CSS variables: docs/API.md.

Features

Client mode (default): pass items; the table searches, filters, sorts, and paginates locally.

Server mode: set v-model:server-options (non-null) plus server-items-length. The parent owns fetch / sort / page; client search and filter are skipped.

| | | | --- | --- | | Sorting | Single or multi-column; numeric-aware; optional Header.sort compare (client) | | Search & filter | Client-only; search-value / search-field / filter-options | | Pagination | Footer, rows-per-page, optional numbered buttons; v-model:current-page in client mode | | Selection | v-model:items-selected (must be non-null to show checkboxes) | | Slots | Item, header, expand, loading, empty, pagination, body, #customize-headers | | Fixed columns | Header.fixed + width; sticky left follows painted width | | Layout | table-height, alternating rows, border cells, theme color, class-name hooks | | Virtual rows | :virtual="true" + :virtual-row-height + preferably table-height and item-key | | Grouped headers | Header.children (prefer this over #customize-headers for groups) | | Summary row | Header.summary aggregations (sum/avg/min/max/count/length), summary-row, #summary* slots; sticky with fixed columns |

Use item-key ("id", "meta.uuid", …) on large, selectable, or virtual tables.

Migrating from vue3-easy-data-table

npm uninstall vue3-easy-data-table
npm install vue-easy-data-table
// before
import Vue3EasyDataTable from 'vue3-easy-data-table';
import 'vue3-easy-data-table/dist/style.css';

// after
import Vue3EasyDataTable from 'vue-easy-data-table';
import 'vue-easy-data-table/dist/style.css';

Component name, props, slots, emits, and CSS classes stay the same. Details: MIGRATION.md.

Docs

| Doc | Use when | | --- | --- | | docs/API.md | Props, slots, emits, expose, CSS variables | | docs/RECIPES.md | Vue 3 SFC examples | | MIGRATION.md | Rename + 1.6.x–1.7.0 additive behavior | | CHANGELOG.md | Release notes | | AGENTS.md | Install rules and pitfalls (also for AI agents) | | Upstream feature gallery | Visual examples; APIs still apply |

CDN

<link href="https://unpkg.com/vue-easy-data-table/dist/style.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.js"></script>
<script src="https://unpkg.com/vue-easy-data-table"></script>

<div id="app">
  <easy-data-table :headers="headers" :items="items" />
</div>

<script>
  const App = {
    components: {
      EasyDataTable: window['vue3-easy-data-table'].default, // or .Vue3EasyDataTable
    },
    data() {
      return {
        headers: [
          { text: 'Name', value: 'name' },
          { text: 'Age', value: 'age', sortable: true },
        ],
        items: [
          { name: 'Curry', age: 20 },
          { name: 'James', age: 21 },
        ],
      };
    },
  };
  Vue.createApp(App).mount('#app');
</script>

The UMD global is still vue3-easy-data-table (dist filename unchanged for compatibility).

License

MIT. Thanks to everyone who filed issues and feature requests on the original project and this fork.