В этой статье мы узнаем, как реализовать сортировку и поиск в массивах с помощью Vue js.
Что мы используем для этого проекта?
1. Vue 3
2. Composition API
3. Поддельный JSON ( jsonplaceholder )
4. Fetch
Vue 3 представляет функцию настройки. Два способа реализации функции настройки.
#one way <script setup> // code </script> #another way <script> export default { setup() { // code } } </script>
Вы хотите узнать больше о настройкеознакомьтесь с официальной документацией
Сначала мы извлекаем всех пользователей из jsonplaceholder.
<script setup> import { ref } from 'vue' const users = ref([]) // get users function getUsers() { fetch('https://jsonplaceholder.typicode.com/users', { method: 'GET'}) .then(res => res.json()) .then(data => users.value = data); } getUsers(); </script>
Мы получаем всех пользователей из API и храним наши данные о пользователях. Теперь мы отображаем всех пользователей
Визуализация пользователя
<table class="styled-table"> <thead> <tr> <th>SL</th> <th>Name</th> <th>Username</th> <th>Email</th> </tr> </thead> <tbody> <tr v-for="(user, ind) in users"> <td>{{ ind+1 }}</td> <td>{{ user.name }}</td> <td>{{ user.username }}</td> <td>{{ user.email }}</td> </tr> </tbody> </table>
Дизайн таблицы
<style> input[type=text] { width: 100%; padding: 12px 20px; margin: 8px 0; display: inline-block; border: 1px solid #ccc; border-radius: 4px; box-sizing: border-box; } .styled-table { border-collapse: collapse; margin: 25px 0; font-size: 0.9em; font-family: sans-serif; min-width: 400px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); } .styled-table thead tr { background-color: #009879; color: #ffffff; text-align: left; } .styled-table th,.styled-table td { padding: 12px 15px; } .styled-table tbody tr { border-bottom: 1px solid #dddddd; } .styled-table tbody tr:nth-of-type(even) { background-color: #f3f3f3; } .styled-table tbody tr:last-of-type { border-bottom: 2px solid #009879; } .styled-table tbody tr.active-row { font-weight: bold; color: #009879; } </style>
Теперь выгляди так
Пришло время заняться поиском
<input type="text" v-model="search" placeholder="Search name" />
мы используем Computed Property. убедитесь, что вы импортируете вычисленные
<script setup> import { ref, computed } from 'vue' const users = ref([]) const search = ref('') // filter users const userFilterAndSearchAndSort = computed(() => { return users.value.filter((user) => { let name = user.name.toLowerCase() let searchValue = search.value.toLowerCase() return name.includes(searchValue) }) }) // get users function getUsers() { fetch('https://jsonplaceholder.typicode.com/users', { method: 'GET'}) .then(res => res.json()) .then(data => users.value = data); } getUsers(); </script>
Здесь вы можете видеть, что мы сохраняем поиск или пользовательский запрос в переменной поиска.
Здесь вы можете видеть метод userFilterAndSearchAndSort, в первую очередь мы фильтруем всех пользователей и проверяем, что это слово включает в себя это user, если есть, то верните user.
Обязательно проверьте эту строку в таблице
<tr v-for="(user, ind) in users"> to <tr v-for="(user, ind) in userFilterAndSearchAndSort">
Теперь ваш результат выглядит так. Наша функция поиска работает.
Сейчас мы работаем над сортировкой
Мы реализуем здесь систему ASC и DSC Like asc a-z A-Z и 0–9
desc z-a Z-a и 9–0. мы не реализуем обратную систему, например, первый элемент показывает последнюю позицию, а последний элемент показывает первую позицию.
Теперь реализуется время.
Нам нужно изменить наш userFilterAndSearchAndSort
const search = ref('') const currentSortDir = ref('asc') const currentSort = ref('name') // filter users const userFilterAndSearchAndSort = computed(() => { let filterUserList = users.value; // search filterUserList = users.value.filter((user) => { let name = user.name.toLowerCase() let searchValue = search.value.toLowerCase() return name.includes(searchValue) }); // sort return filterUserList.sort((a,b) => { let currentSortDirValue = currentSortDir.value let currentSortValue = currentSort.value let modifier = 1; if(currentSortDirValue === 'desc') modifier = -1; if(a[currentSortValue] < b[currentSortValue]) return -1 * modifier; if(a[currentSortValue] > b[currentSortValue]) return 1 * modifier; return 0; }) })
добавлен новый метод
function sortBy(param) { if(param === currentSort.value) { currentSortDir.value = currentSortDir.value==='asc'?'desc':'asc'; } currentSort.value = param; }
И обновить таблицу и CSS
<th> <a href="#" @click="sortBy('name')" :class="[currentSort == 'name' ? 'active' : '']"> Name </a> </th> <th> <a href="#" @click="sortBy('username')" :class="[currentSort == 'username' ? 'active' : '']"> Username </a> </th> ## css a { text-decoration: none; color: white; } .active { color: black; }
Оформление заказаИсходный код&демонстрация
Наслаждайтесь кодами.