Sort by key

practical example of sorting

Ordered by 'body'

      est natus enim nihil est dolore omnis voluptatem numquam et omnis occaecati quod ullam at voluptatem error expedita pariatur nihil sint nostrum voluptatem reiciendis et
      Jayne_Kuhic@sydney.comquo vero reiciendis velit similique earum
      harum non quasi et ratione tempore iure ex voluptates in ratione harum architecto fugit inventore cupiditate voluptates magni quo et
      Hayden@althea.bizvero eaque aliquid doloribus et culpa
      laudantium enim quasi est quidem magnam voluptate ipsam eos tempora quo necessitatibus dolor quam autem quasi reiciendis et nam sapiente accusantium
      Eliseo@gardner.bizid labore ex et quam laborum
      non et atque occaecati deserunt quas accusantium unde odit nobis qui voluptatem quia voluptas consequuntur itaque dolor et qui rerum deleniti ut occaecati
      Lew@alysha.tvalias odio sit
      quia molestiae reprehenderit quasi aspernatur aut expedita occaecati aliquam eveniet laudantium omnis quibusdam delectus saepe quia accusamus maiores nam est cum et ducimus et vero voluptates excepturi deleniti ratione
      Nikita@garfield.bizodio adipisci rerum aut animi
<template>
  <div>
    <p class="text-center">
      practical example of sorting
    </p>

    <div class="flex justify-around items-center">
      <p class="text-sm mt-4 mb-2">
        Ordered by '{{ order }}'
      </p>
      <select v-model="orderDirection" class="p-.5 inline-flex items-center border border-light-blue-300 rounded dark:text-dark-50 focus:outline-none dark:bg-gray-800 dark:text-light-300">
        <option value="asc">
          asc
        </option>
        <option value="desc">
          desc
        </option>
      </select>
    </div>

    <div class="text-sm mt-4 flex justify-around dark:text-light-800">
      <button :class="checkActive('body')" @click="sortByOrder('body')">
        Comment
      </button>
      <button :class="checkActive('name')" @click="sortByOrder('name')">
        Username
      </button>
      <button :class="checkActive('email')" @click="sortByOrder('email')">
        Email
      </button>
    </div>
    <div class="comments-list">
      <ul v-if="sortedComments" class="space-y-4">
        <ol v-for="comment in sortedComments" :key="comment.id" class="m-4 rounded-md border p-3 text-xs shadow-md bg-light-blue-100 dark:border-transparent cursor-pointer dark:text-light-200 dark:bg-gray-800 dark:hover:transform dark:hover:-translate-y-0.5 dark:hover:transition-transform">
          <div class="comment-text mb-2 text-left">
            {{ comment.body }}
          </div>

          <div class="name flex justify-around">
            <span class="text-pink-500 ">{{ comment.email }}</span>
            <span class="text-blue-500">{{ comment.name }} </span>
          </div>
        </ol>
      </ul>
      <p v-else-if="error" class="text-sm text-red-500">
        Error fetching data
      </p>
      <p v-else class="text-sm text-blue-500">
        Loading...
      </p>
    </div>
  </div>
</template>

<script lang="ts">
interface UserComment {
  postId: number
  id: number
  name: string
  email: string
  body: string
}
      type OrderTerm = 'body' | 'name' | 'email'
      type OrderDirection = 'asc' | 'desc'

export default defineComponent({
  setup() {
    const comments = ref<UserComment[]>([])
    const error = ref<string>()
    const order = ref<OrderTerm>('body')
    const orderDirection = ref<OrderDirection>('asc')

    onMounted(() => {
      fetch('https://jsonplaceholder.typicode.com/comments')
        .then(response => response.json())
        .then(json => comments.value = json.slice(0, 5))
        .catch(error => error.value = error)
    })

    const sortedComments = computed(() => {
      return [...comments.value].sort((a: UserComment, b: UserComment) => {
        if (orderDirection.value === 'asc')
          return a[order.value] > b[order.value] ? 1 : -1
        return a[order.value] < b[order.value] ? 1 : -1
      })
    })

    const sortByOrder = (term: OrderTerm) => {
      order.value = term
    }

    const checkActive = (term: OrderTerm) => {
      return order.value === term ? 'outline-blue-400' : null
    }
    return {
      error,
      order,
      orderDirection,
      sortedComments,
      sortByOrder,
      checkActive,
    }
  },
})
</script>

<style scoped>
button {
    @apply rounded bg-light-blue-200 px-2 py-1 focus:outline-light-blue-400 dark:bg-gray-800
}
</style>

Made with by leovoon