Mixins в Vue
▸Определение
Mixins — это способ переиспользования кода в Options API. Они позволяют включать общую логику в компоненты.
▸Создание mixin
1// mixins/dateFormat.js2export default {3 data() {4 return {5 currentDate: new Date(),6 };7 },8 computed: {9 formattedDate() {10 return this.currentDate.toLocaleDateString('ru-RU');11 },12 },13 methods: {14 formatDate(date) {15 return date.toLocaleDateString('ru-RU');16 },17 },18};
▸Использование
1<script>2import dateFormat from '@/mixins/dateFormat';34export default {5 mixins: [dateFormat],6 mounted() {7 console.log(this.formattedDate);8 },9};10</script>
Проблемы Mixins
▸Конфликты имён
1// mixin1.js2export default {3 data() {4 return { count: 0 };5 },6};78// mixin2.js9export default {10 data() {11 return { count: 10 }; // конфликт!12 },13};
▸Неочевидные зависимости
Компонент может использовать методы и данные из mixin, но непонятно откуда они берутся.
▸Трудности с отладкой
Ошибки в mixin сложно отслеживать, особенно когда их несколько.
▸TypeScript
Mixins плохо работают с TypeScript. Типизация затруднена.
Composables в Vue 3
▸Определение
Composables — это функции, использующие Vue hooks для переиспользования логики. Это рекомендуемый подход в Vue 3.
▸Создание composable
1// composables/useDateFormat.js2import { ref, computed } from 'vue';34export function useDateFormat() {5 const currentDate = ref(new Date());67 const formattedDate = computed(() =>8 currentDate.value.toLocaleDateString('ru-RU')9 );1011 function formatDate(date) {12 return date.toLocaleDateString('ru-RU');13 }1415 return { currentDate, formattedDate, formatDate };16}
▸Использование
1<script setup>2import { useDateFormat } from '@/composables/useDateFormat';34const { formattedDate, formatDate } = useDateFormat();5</script>
Преимущества Composables
▸Явные зависимости
Все зависимости видны в месте использования. Нет скрытого кода.
▸Отсутствие конфликтов
Каждый composable возвращает свой набор значений. Конфликты исключены.
▸TypeScript
Composables полностью поддерживают TypeScript. Дженерики работают отлично.
▸Tree-shaking
Composables tree-shakeаются автоматически. Ненужный код не попадает в bundle.
Паттерны Composables
▸useCounter
1import { ref } from 'vue';23export function useCounter(initialValue = 0) {4 const count = ref(initialValue);56 const increment = () => count.value++;7 const decrement = () => count.value--;8 const reset = () => (count.value = initialValue);910 return { count, increment, decrement, reset };11}
▸useFetch
1import { ref, watchEffect } from 'vue';23export function useFetch(url) {4 const data = ref(null);5 const loading = ref(true);6 const error = ref(null);78 watchEffect(async () => {9 try {10 loading.value = true;11 const response = await fetch(url);12 data.value = await response.json();13 } catch (err) {14 error.value = err;15 } finally {16 loading.value = false;17 }18 });1920 return { data, loading, error };21}
▸useLocalStorage
1import { ref, watch } from 'vue';23export function useLocalStorage(key, initialValue) {4 const stored = ref(5 JSON.parse(localStorage.getItem(key)) || initialValue6 );78 watch(stored, (newValue) => {9 localStorage.setItem(key, JSON.stringify(newValue));10 }, { deep: true });1112 return stored;13}
Миграция с Mixins
▸Пошаговая миграция
Создайте composable из логики mixin
Замените mixin на import composable
Обновите компонент для использования composable
Удалите mixin
▸Параллельная работа
Вы можете использовать mixins и composables одновременно, что позволяет мигрировать постепенно.
Когда использовать Mixins
Когда использовать Composables
Заключение
Composables — это будущее переиспользования логики во Vue. Они проще, безопаснее и лучше работают с TypeScript. Мигрируйте с mixins постепенно, начиная с новых компонентов.