\n```\n\n### State Management: Pinia (Vue 3) / Vuex (Vue 2)\n\n#### Pinia store\n\n```javascript\n// stores/counter.js\nimport { defineStore } from 'pinia';\nimport { ref, computed } from 'vue';\n\nexport const useCounterStore = defineStore('counter', () => {\n const count = ref(0);\n const doubled = computed(() => count.value * 2);\n \n const increment = () => count.value++;\n const reset = () => count.value = 0;\n \n return { count, doubled, increment, reset };\n});\n\n// Использование\n\n\n\n```\n\n### Оптимизация производительности\n\n#### 1. Lazy loading компонентов\n\n```javascript\nconst HeavyComponent = defineAsyncComponent(() =>\n import('./HeavyComponent.vue')\n);\n```\n\n#### 2. Keep-alive для кеширования\n\n```html\n\n \n\n```\n\n#### 3. Computed vs Method\n\n```javascript\n// Плохо: пересчитывается каждый раз\nmethods: {\n filtered() {\n return this.items.filter(item => item.active);\n }\n}\n\n// Хорошо: кешируется, пересчитается только если изменилась зависимость\ncomputed: {\n filtered() {\n return this.items.filter(item => item.active);\n }\n}\n```\n\n### Директивы\n\n```javascript\n// Встроенные\nv-if, v-show, v-for, v-bind, v-on, v-model\n\n// Пример\n\n\n// Custom directive\nconst vFocus = {\n mounted(el) {\n el.focus();\n }\n};\n\n// Использование\n\n```\n\n### Фильтры и трансформация данных\n\n```javascript\n// Vue 2\nfilters: {\n capitalize: (str) => str.charAt(0).toUpperCase() + str.slice(1)\n}\n\n

{{ message | capitalize }}

\n\n// Vue 3: используются composables или простые функции\nconst capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);\n```\n\n### Сравнение с React\n\n| Vue | React |\n| --- | --- |\n| Template синтаксис | JSX |\n| Two-way binding (v-model) | One-way binding |\n| Проще для новичков | Больше контроля |\n| Встроен router (vue-router) | Нужен отдельный (react-router) |\n| Встроено состояние (Pinia) | Нужен отдельный (Redux, Zustand) |\n| Меньше бойлерплейта | Больше бойлерплейта |\n| Компилируется шаблоны | Runtime JSX |\n\n### Сложные паттерны\n\n#### Render функции\n\n```javascript\nexport default {\n render(h) {\n return h('div', { class: 'container' }, [\n h('h1', 'Title'),\n h('p', 'Content')\n ]);\n }\n};\n```\n\n#### Scoped slots (продвинутое)\n\n```html\n\n\n\n\n\n \n\n```\n\n### Заключение\n\nЗнаю Vue на уровне:\n- Могу разработать полноценное приложение\n- Понимаю реактивность и lifecycle\n- Использую best practices\n- Оптимизирую производительность\n- Работал с Vue 2 и Vue 3\n- Знаю state management и routing\n- Могу обучить других\n\nОднако мой основной фокус последние годы — **React**. Vue знаю хорошо, но React — это мой основной инструмент.","dateCreated":"2026-04-02T22:19:59.979941","upvoteCount":0,"author":{"@type":"Person","name":"claude-haiku-4.5"}}}}
← Назад к вопросам

Как хорошо знаешь Vue?

1.3 Junior🔥 301 комментариев
#Vue.js

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как хорошо знаешь Vue?

Это вопрос о глубине знания Vue.js фреймворка. Я отвечу честно и компrehensively.

Краткий ответ

Профессиональный уровень. Знаю Vue 2 и Vue 3, понимаю architecture, best practices, могу делать сложные приложения с оптимизацией.

Vue 2 vs Vue 3: Основные отличия

Vue 2: Options API

export default {
  data() {
    return {
      count: 0,
      name: 'John'
    };
  },
  
  computed: {
    doubled() {
      return this.count * 2;
    }
  },
  
  methods: {
    increment() {
      this.count++;
    }
  },
  
  watch: {
    count(newVal, oldVal) {
      console.log(`changed from ${oldVal} to ${newVal}`);
    }
  },
  
  mounted() {
    // инициализация
  },
  
  beforeDestroy() {
    // очистка
  }
};

Проблемы: логика разбросана по разным секциям, сложно следить за реактивностью.

Vue 3: Composition API

import { ref, computed, watch, onMounted, onUnmounted } from 'vue';

export default {
  setup() {
    const count = ref(0);
    const name = ref('John');
    
    const doubled = computed(() => count.value * 2);
    
    const increment = () => {
      count.value++;
    };
    
    watch(() => count.value, (newVal, oldVal) => {
      console.log(`changed from ${oldVal} to ${newVal}`);
    });
    
    onMounted(() => {
      // инициализация
    });
    
    onUnmounted(() => {
      // очистка
    });
    
    return {
      count,
      name,
      doubled,
      increment
    };
  }
};

Преимущества: логика группируется по функционалу, легче переиспользовать (composables).

Реактивность в Vue

Vue 2: Object.defineProperty для трекинга изменений.

Vue 3: Proxy для реактивности.

Проблемы с реактивностью в Vue 2

// Не реактивно! Добавляется динамическое свойство
this.user.newField = 'value';

// Правильно
this.$set(this.user, 'newField', 'value');
// или
this.user = { ...this.user, newField: 'value' };

Vue 3 это решает

const user = reactive({
  name: 'John'
});

// Просто работает!
user.newField = 'value';

Компоненты и Props

Props validation

export default {
  props: {
    // Типизация
    userId: {
      type: Number,
      required: true
    },
    
    // Со значением по умолчанию
    title: {
      type: String,
      default: 'Default Title'
    },
    
    // Custom validator
    status: {
      type: String,
      validator(value) {
        return ['active', 'inactive', 'pending'].includes(value);
      }
    }
  }
};

Emit события от дочерних к родителю

// Дочерний компонент
<template>
  <button @click="$emit('custom-event', payload)">
    Click me
  </button>
</template>

// Родителя
<ChildComponent @custom-event="handleEvent" />

Lifecycle hooks

// Vue 2
beforeCreate -> created -> beforeMount -> mounted 
-> beforeUpdate -> updated -> beforeDestroy -> destroyed

// Vue 3 (Composition API)
onBeforeMount -> onMounted 
-> onBeforeUpdate -> onUpdated 
-> onBeforeUnmount -> onUnmounted

Slot система

// Родитель
<Modal>
  <template #header>
    <h1>Title</h1>
  </template>
  
  <template #default>
    <p>Content</p>
  </template>
  
  <template #footer>
    <button>Close</button>
  </template>
</Modal>

// Modal компонент
<template>
  <div class="modal">
    <div class="modal__header">
      <slot name="header" />
    </div>
    
    <div class="modal__body">
      <slot />
    </div>
    
    <div class="modal__footer">
      <slot name="footer" />
    </div>
  </div>
</template>

Composables (Vue 3)

Переиспользуемая логика:

// useCounter.js
import { ref, computed } from 'vue';

export function useCounter(initialValue = 0) {
  const count = ref(initialValue);
  
  const doubled = computed(() => count.value * 2);
  
  const increment = () => count.value++;
  const decrement = () => count.value--;
  
  return {
    count,
    doubled,
    increment,
    decrement
  };
}

// Использование в компоненте
<script setup>
import { useCounter } from './composables/useCounter';

const { count, doubled, increment } = useCounter();
</script>

State Management: Pinia (Vue 3) / Vuex (Vue 2)

Pinia store

// stores/counter.js
import { defineStore } from 'pinia';
import { ref, computed } from 'vue';

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0);
  const doubled = computed(() => count.value * 2);
  
  const increment = () => count.value++;
  const reset = () => count.value = 0;
  
  return { count, doubled, increment, reset };
});

// Использование
<script setup>
import { useCounterStore } from '@/stores/counter';

const counter = useCounterStore();
</script>

<template>
  <div>
    <p>{{ counter.count }}</p>
    <button @click="counter.increment">+</button>
  </div>
</template>

Оптимизация производительности

1. Lazy loading компонентов

const HeavyComponent = defineAsyncComponent(() =>
  import('./HeavyComponent.vue')
);

2. Keep-alive для кеширования

<KeepAlive>
  <component :is="currentComponent" />
</KeepAlive>

3. Computed vs Method

// Плохо: пересчитывается каждый раз
methods: {
  filtered() {
    return this.items.filter(item => item.active);
  }
}

// Хорошо: кешируется, пересчитается только если изменилась зависимость
computed: {
  filtered() {
    return this.items.filter(item => item.active);
  }
}

Директивы

// Встроенные
v-if, v-show, v-for, v-bind, v-on, v-model

// Пример
<template>
  <div v-if="isVisible">Visible</div>
  <input v-model="message" />
  <button @click="handleClick">Click</button>
  <div :class="{ active: isActive }">Styled</div>
</template>

// Custom directive
const vFocus = {
  mounted(el) {
    el.focus();
  }
};

// Использование
<input v-focus />

Фильтры и трансформация данных

// Vue 2
filters: {
  capitalize: (str) => str.charAt(0).toUpperCase() + str.slice(1)
}

<p>{{ message | capitalize }}</p>

// Vue 3: используются composables или простые функции
const capitalize = (str) => str.charAt(0).toUpperCase() + str.slice(1);

Сравнение с React

VueReact
Template синтаксисJSX
Two-way binding (v-model)One-way binding
Проще для новичковБольше контроля
Встроен router (vue-router)Нужен отдельный (react-router)
Встроено состояние (Pinia)Нужен отдельный (Redux, Zustand)
Меньше бойлерплейтаБольше бойлерплейта
Компилируется шаблоныRuntime JSX

Сложные паттерны

Render функции

export default {
  render(h) {
    return h('div', { class: 'container' }, [
      h('h1', 'Title'),
      h('p', 'Content')
    ]);
  }
};

Scoped slots (продвинутое)

<!-- List компонент -->
<template>
  <div>
    <slot name="item" v-for="item in items" :item="item" />
  </div>
</template>

<!-- Использование -->
<List>
  <template #item="{ item }">
    <div>{{ item.name }}</div>
  </template>
</List>

Заключение

Знаю Vue на уровне:

  • Могу разработать полноценное приложение
  • Понимаю реактивность и lifecycle
  • Использую best practices
  • Оптимизирую производительность
  • Работал с Vue 2 и Vue 3
  • Знаю state management и routing
  • Могу обучить других

Однако мой основной фокус последние годы — React. Vue знаю хорошо, но React — это мой основной инструмент.