import { ref, computed } from "vue" import { useQuery, keepPreviousData } from "@tanstack/vue-query" import { useVueTable, createColumnHelper, getCoreRowModel, type SortingState, type PaginationState } from "@tanstack/vue-table" const sorting = ref([]) const pagination = ref({ pageIndex:0, pageSize:20 }) const { data:serverData } = useQuery({ queryKey: computed(()=>["users",{ sort:sorting.value[0], ...pagination.value }]), queryFn: ()=>fetchUsers({ sortBy: sorting.value[0]?.id, sortDir: sorting.value[0]?.desc?"desc":"asc", page: pagination.value.pageIndex, pageSize: pagination.value.pageSize, }), placeholderData: keepPreviousData, }) const ch=createColumnHelper() const columns=[ch.accessor("name",{header:"Name",enableSorting:true})] const table=useVueTable({ get data(){ return serverData.value?.rows??[] }, get rowCount(){ return serverData.value?.total??0 }, columns, manualSorting: true, manualPagination: true, state:{ get sorting(){ return sorting.value }, get pagination(){ return pagination.value }, }, onSortingChange: v=>{ sorting.value=typeof v==="function"?v(sorting.value):v }, onPaginationChange: v=>{ pagination.value=typeof v==="function"?v(pagination.value):v }, getCoreRowModel: getCoreRowModel(), }) "> import { ref, computed } from "vue" import { useQuery, keepPreviousData } from "@tanstack/vue-query" import { useVueTable, createColumnHelper, getCoreRowModel, type SortingState, type PaginationState } from "@tanstack/vue-table" const sorting = ref([]) const pagination = ref({ pageIndex:0, pageSize:20 }) const { data:serverData } = useQuery({ queryKey: computed(()=>["users",{ sort:sorting.value[0], ...pagination.value }]), queryFn: ()=>fetchUsers({ sortBy: sorting.value[0]?.id, sortDir: sorting.value[0]?.desc?"desc":"asc", page: pagination.value.pageIndex, pageSize: pagination.value.pageSize, }), placeholderData: keepPreviousData, }) const ch=createColumnHelper() const columns=[ch.accessor("name",{header:"Name",enableSorting:true})] const table=useVueTable({ get data(){ return serverData.value?.rows??[] }, get rowCount(){ return serverData.value?.total??0 }, columns, manualSorting: true, manualPagination: true, state:{ get sorting(){ return sorting.value }, get pagination(){ return pagination.value }, }, onSortingChange: v=>{ sorting.value=typeof v==="function"?v(sorting.value):v }, onPaginationChange: v=>{ pagination.value=typeof v==="function"?v(pagination.value):v }, getCoreRowModel: getCoreRowModel(), }) " />

Prev Next

Web / TanStack Interview Questions

How do you integrate TanStack Table with server-side sorting, filtering and pagination?

Set manualSorting and manualPagination to true. TanStack Table manages UI state (current sort, page) but does not process rows — you read that state and send it to your API.

<script setup lang="ts">
import { ref, computed }  from "vue"
import { useQuery, keepPreviousData } from "@tanstack/vue-query"
import { useVueTable, createColumnHelper, getCoreRowModel,
         type SortingState, type PaginationState } from "@tanstack/vue-table"

const sorting    = ref<SortingState>([])
const pagination = ref<PaginationState>({ pageIndex:0, pageSize:20 })

const { data:serverData } = useQuery({
  queryKey: computed(()=>["users",{ sort:sorting.value[0], ...pagination.value }]),
  queryFn:  ()=>fetchUsers({
    sortBy:   sorting.value[0]?.id,
    sortDir:  sorting.value[0]?.desc?"desc":"asc",
    page:     pagination.value.pageIndex,
    pageSize: pagination.value.pageSize,
  }),
  placeholderData: keepPreviousData,
})

const ch=createColumnHelper<User>()
const columns=[ch.accessor("name",{header:"Name",enableSorting:true})]

const table=useVueTable({
  get data(){    return serverData.value?.rows??[] },
  get rowCount(){ return serverData.value?.total??0 },
  columns,
  manualSorting:    true,
  manualPagination: true,
  state:{
    get sorting(){    return sorting.value },
    get pagination(){ return pagination.value },
  },
  onSortingChange:    v=>{ sorting.value=typeof v==="function"?v(sorting.value):v },
  onPaginationChange: v=>{ pagination.value=typeof v==="function"?v(pagination.value):v },
  getCoreRowModel: getCoreRowModel(),
})
</script>
What does manualSorting:true tell TanStack Table?
Why is keepPreviousData important with server-side pagination?

Invest now in Acorns!!! 🚀 Join Acorns and get your $5 bonus!

Invest now in Acorns!!! 🚀
Join Acorns and get your $5 bonus!

Earn passively and while sleeping

Acorns is a micro-investing app that automatically invests your "spare change" from daily purchases into diversified, expert-built portfolios of ETFs. It is designed for beginners, allowing you to start investing with as little as $5. The service automates saving and investing. Disclosure: I may receive a referral bonus.

Invest now!!! Get Free equity stock (US, UK only)!

Use Robinhood app to invest in stocks. It is safe and secure. Use the Referral link to claim your free stock when you sign up!.

The Robinhood app makes it easy to trade stocks, crypto and more.


Webull! Receive free stock by signing up using the link: Webull signup.

More Related questions...

What is TanStack and what problem does it solve for frontend developers? What is TanStack Query and what core problems does it solve over plain fetch in Vue? How do you set up TanStack Query in a Vue application? How should you design queryKeys in TanStack Query and why do they matter? What is the difference between staleTime and gcTime in TanStack Query? What are the most useful useQuery options beyond queryKey and queryFn in Vue? What is useMutation and how do you use it to submit data in Vue? How do you write dependent (sequential) queries in TanStack Query with Vue? How do you implement pagination and infinite scroll with TanStack Query? How do you prefetch data in TanStack Query to speed up navigation? What is TanStack Router and how does it differ from Vue Router? How do you define routes in TanStack Router with Vue? How do you use URL search params as typed state in TanStack Router? What are route loaders in TanStack Router and how do they integrate with TanStack Query? What is TanStack Table and how do you create a basic table in Vue? How do you add client-side sorting and column filtering to a TanStack Table in Vue? How do you implement pagination with TanStack Table? How do you add column visibility toggling and row selection to a TanStack Table? What is TanStack Form and how do you build a basic form in Vue? How do you add synchronous and asynchronous field validation in TanStack Form? How do you manage dynamic field arrays in TanStack Form? What is TanStack Virtual and when should you use it? How do you handle variable-height rows in TanStack Virtual? How do you combine useInfiniteQuery with useVirtualizer for an infinitely scrolling virtualised list? How do you implement optimistic updates with TanStack Query? What are the status and fetchStatus values in TanStack Query v5 and how do they drive UI? How do you create links and perform programmatic navigation in TanStack Router with Vue? How does TanStack Router handle route-level errors and loading states? How do you integrate TanStack Table with server-side sorting, filtering and pagination? What developer tools does TanStack provide and how do you add them in Vue? What are query key factories and why are they recommended for large Vue apps? How do you implement cross-field (form-level) validation and handle submission in TanStack Form? How do you pass variables to a mutation and use them across lifecycle callbacks? How do you virtualise a horizontal list or two-dimensional grid with TanStack Virtual? What are the most common TanStack Query mistakes in Vue and how do you avoid them? How do you implement protected routes and auth redirects in TanStack Router? How do you render custom Vue components inside TanStack Table cells? How do the TanStack libraries compose into a full application stack, and what is TanStack Start?


Comments & Discussions