Vue.js — это прогрессивный JavaScript-фреймворк, предназначенный для создания интерактивных пользовательских интерфейсов. Его главная сила заключается в реактивности данных и компонентной архитектуре, что особенно важно для сложных приложений, таких как социальные сети, где интерфейс постоянно обновляется в зависимости от действий пользователей.
Основной строительный блок Vue — компонент. Компоненты позволяют разделять интерфейс на логические части, каждая из которых управляет своей функциональностью.
<template>
<div class="user-card">
<img :src="user.avatar" alt="Avatar">
<h3>{{ user.name }}</h3>
<p>{{ user.bio }}</p>
</div>
</template>
<script>
export default {
props: ['user']
}
</script>
<style scoped>
.user-card {
border: 1px solid #ccc;
padding: 10px;
border-radius: 8px;
}
</style>
Ключевые моменты:
props позволяют передавать данные в компонент.template описывает разметку, а {{ }}
связывает данные с HTML.scoped в стилях изолирует CSS для конкретного
компонента.Vue автоматически отслеживает изменения в данных и обновляет интерфейс без ручного DOM-манипулирования.
<template>
<div>
<input v-model="newPost" placeholder="Что нового?">
<button @click="addPost">Опубликовать</button>
<ul>
<li v-for="post in posts" :key="post.id">{{ post.text }}</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
newPost: '',
posts: []
};
},
methods: {
addPost() {
if(this.newPost.trim() !== '') {
this.posts.push({ id: Date.now(), text: this.newPost });
this.newPost = '';
}
}
}
}
</script>
Ключевые моменты:
v-model обеспечивает двустороннюю привязку данных.v-for используется для динамического отображения
списков.methods) управляют логикой компонента.Компоненты могут взаимодействовать между собой через события.
<!-- Parent.vue -->
<template>
<div>
<post-form @post-created="handleNewPost"></post-form>
<post-list :posts="posts"></post-list>
</div>
</template>
<script>
import PostForm from './PostForm.vue'
import PostList from './PostList.vue'
export default {
components: { PostForm, PostList },
data() {
return { posts: [] };
},
methods: {
handleNewPost(post) {
this.posts.push(post);
}
}
}
</script>
<!-- PostForm.vue -->
<template>
<div>
<input v-model="text" placeholder="Что нового?">
<button @click="createPost">Опубликовать</button>
</div>
</template>
<script>
export default {
data() { return { text: '' }; },
methods: {
createPost() {
if(this.text.trim() !== '') {
this.$emit('post-created', { id: Date.now(), text: this.text });
this.text = '';
}
}
}
}
</script>
Ключевые моменты:
$emit позволяет дочернему компоненту отправлять события
родителю.Социальная сеть активно взаимодействует с сервером. Vue обеспечивает удобные способы работы с API.
<template>
<div>
<h2>Лента новостей</h2>
<ul>
<li v-for="post in posts" :key="post.id">{{ post.text }}</li>
</ul>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return { posts: [] };
},
async created() {
try {
const response = await axios.get('/api/posts');
this.posts = response.data;
} catch (error) {
console.error('Ошибка загрузки постов:', error);
}
}
}
</script>
Ключевые моменты:
created используется для выполнения действий при
инициализации компонента.axios или fetch позволяют получать данные
с сервера.Для крупных приложений рекомендуется использовать Vuex или встроенный Composition API для глобального состояния.
// store.js
import { reactive } from 'vue';
export const store = reactive({
user: null,
posts: [],
setUser(user) { this.user = user; },
addPost(post) { this.posts.push(post); }
});
// Любой компонент
import { store } from './store.js';
store.setUser({ id: 1, name: 'Иван' });
store.addPost({ id: Date.now(), text: 'Привет, Vue!' });
Ключевые моменты:
reactive делает объект полностью реактивным.Vue Router обеспечивает удобную навигацию между страницами социальной сети.
// router.js
import { createRouter, createWebHistory } from 'vue-router';
import Home from './components/Home.vue';
import Profile from './components/Profile.vue';
const routes = [
{ path: '/', component: Home },
{ path: '/profile/:id', component: Profile }
];
export const router = createRouter({
history: createWebHistory(),
routes
});
<template>
<router-link :to="'/profile/' + user.id">{{ user.name }}</router-link>
<router-view></router-view>
</template>
Ключевые моменты:
router-link заменяет обычные <a> для
плавной навигации.router-view отображает компонент текущего
маршрута.:id) позволяют создавать
динамические страницы профилей.Vue поддерживает простую интеграцию анимаций с помощью
<transition>.
<template>
<transition name="fade">
<div v-if="showPost">{{ post.text }}</div>
</transition>
</template>
<style>
.fade-enter-active, .fade-leave-active {
transition: opacity 0.5s;
}
.fade-enter-from, .fade-leave-to {
opacity: 0;
}
</style>
Ключевые моменты:
v-if управляет условным отображением элементов.-enter и -leave управляют
анимацией появления и исчезновения.Composition API позволяет структурировать логику более гибко и удобно для крупных проектов.
<template>
<div>
<h3>Комментарии</h3>
<ul>
<li v-for="comment in comments" :key="comment.id">{{ comment.text }}</li>
</ul>
</div>
</template>
<script>
import { ref, onMounted } from 'vue';
import axios from 'axios';
export default {
setup() {
const comments = ref([]);
onMounted(async () => {
const response = await axios.get('/api/comments');
comments.value = response.data;
});
return { comments };
}
}
</script>
Ключевые моменты:
ref создаёт реактивное примитивное значение.onMounted выполняет код при инициализации
компонента.Эта структура позволяет создавать масштабируемый, интерактивный и удобный интерфейс для социальной сети, который легко поддерживать и расширять.