Vue 3 – это популярный JavaScript-фреймворк для создания пользовательских интерфейсов. Он обладает простым и интуитивно понятным API, что делает его идеальным выбором для начинающих разработчиков. В этом уроке мы рассмотрим основы Vue 3 и создадим простой интернет-магазин Vue Sneakers.
Шаг 1: Установка Vue CLI
Первым шагом будет установка Vue CLI – официального инструмента для быстрого старта проектов на Vue. Для этого откройте терминал и выполните следующие команды:
npm install -g @vue/cli
vue create vue-sneakers
cd vue-sneakers
Эти команды установят Vue CLI и создадут новый проект с названием "vue-sneakers".
Шаг 2: Создание компонентов
Vue основан на компонентном подходе, поэтому создадим несколько компонентов для нашего интернет-магазина. Создайте следующие файлы в папке src/components
:
Navbar.vue
ProductList.vue
Cart.vue
Шаг 3: Разработка компонентов
Теперь давайте разработаем каждый компонент по отдельности.
Navbar.vue:
<template>
<div class="navbar">
<h1>Vue Sneakers</h1>
</div>
</template>
<script>
export default {
name: 'Navbar'
}
</script>
<style>
.navbar {
background: #333;
color: #fff;
padding: 10px;
text-align: center;
}
</style>
ProductList.vue:
<template>
<div class="product-list">
<div v-for="product in products" :key="product.id" class="product-card">
<img :src="product.image" :alt="product.name">
<h3>{{ product.name }}</h3>
<p>{{ product.price }}</p>
<button @click="addToCart(product.id)">Add to Cart</button>
</div>
</div>
</template>
<script>
export default {
name: 'ProductList',
props: ['products'],
methods: {
addToCart(id) {
this.$emit('add-to-cart', id);
}
}
}
</script>
<style>
.product-list {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.product-card {
border: 1px solid #ccc;
padding: 10px;
text-align: center;
}
</style>
Cart.vue:
<template>
<div class="cart">
<h2>Cart</h2>
<ul>
<li v-for="item in cart" :key="item.id">
{{ item.name }} - {{ item.price }}
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'Cart',
props: ['cart']
}
</script>
<style>
.cart {
border: 1px solid #ccc;
padding: 10px;
}
</style>
Шаг 4: Интеграция компонентов
Теперь давайте интегрируем эти компоненты в нашем приложении. Откройте файл src/App.vue
и добавьте следующий код:
<template>
<div>
<Navbar />
<ProductList :products="products" @add-to-cart="addToCart" />
<Cart :cart="cart" />
</div>
</template>
<script>
import Navbar from './components/Navbar.vue';
import ProductList from './components/ProductList.vue';
import Cart from './components/Cart.vue';
export default {
name: 'App',
components: {
Navbar,
ProductList,
Cart
},
data() {
return {
products: [
{ id: 1, name: 'Nike Air Max', price: 100, image: 'nike.png' },
{ id: 2, name: 'Adidas Superstar', price: 80, image: 'adidas.png' },
{ id: 3, name: 'Puma Suede', price: 90, image: 'puma.png' }
],
cart: []
}
},
methods: {
addToCart(id) {
const product = this.products.find(p => p.id === id);
this.cart.push(product);
}
}
}
</script>
<style>
/* Add your global styles here */
</style>
Шаг 5: Запуск приложения
Теперь наше приложение готово к запуску. Запустите его, выполнив следующую команду в терминале:
npm run serve
Откройте браузер и перейдите по адресу http://localhost:8080
. Вы увидите простой интернет-магазин Vue Sneakers с возможностью добавления товаров в корзину.
Это был основной урок по разработке интернет-магазина на Vue 3 для начинающих. Надеюсь, этот урок был полезен для вас! Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях. Удачи в изучении Vue 3!
Благодарю всех за фидбек и тех поддержал в Boosty! Курс опубликован, ссылки на все ресурсы указаны в описании 👇
Если вы хотите задеплоить приложение, советую использовать Vercel (сделал туториал: https://youtu.be/dnfdrvuHFks)
P.S.: Где-то с 6 часов в видео микрофон начал тупить и, к сожалению, я не проверил этот момент, за что прошу заранее извинить и понять 🥲
Если вы обратите внимание на календарь, то одна часть идёт в 22 октября, другая продолжается 3 ноября. За это время успел заболеть, забыть о курсе на неделю, перенастраивал микрофон для рабочих созвонов, в последствии слышны дэбильные шумы как из мемов с усиленным звуком.
Спасибо!
Вьёрстку 1:02:33
Про разницу props и emits. Передавая функцию в props вы даёте не только право её вызова, но и право её распространения. Например, вы хотите, чтобы счётчик мог увеличивать только один компонент. Вы передаёте ему props с функцией увеличения счётчика. А он эту функцию берёт и отдаёт следующему компоненту, тот ещё куда-нибудь эту функцию отдаёт. В итоге половина компонентов сайта может увеличивать счётчик, и мы теперь в душе не понимаем, что на наш любимый счётчик повлияло и почему он такой большой.
Отличный курс!!! Жду когда будет курс по Vue с применением state-менеджера и Nuxt!!!
net
Спасибо за курс!👍
смотри мне по апи сейчас дали данные на инет магазин . зачем мне это делать на локалке сразу на хомте ж лучше писать и работать с апи
хорошо объясняешь. только к примеру мне надо с ральными данными работать которые приходят не на локалке а на хосте.
privet bratok, turn on autosave please, balshoy privet iz turkmenistan, ashkabat
title не показывает
<script setup>
defineProps({
id: Number,
title: String,
imageUrl: String,
price: Number
})
</script>
<template>
<div class="flex items-center border border-slate-200 p-4 rounded-xl gap-4">
<img class="w-16 h-16" :src="imageUrl" :alt="title" />
<div class="flex flex-col flex-1">
<p>{{ title }}</p>
<div class="flex justify-between mt-2">
<b class="flex-1">{{ price }} руб.</b>
<img class="opacity-40 hover:opacity-100 cursor-pointer transition" src="/close.svg" />
</div>
</div>
</div>
</template>
это не vuejs это курс по tailwindcss который нормально не работает!!!
Пожалуйста, не произноси "Vite" как "White"
Имба, посмотрел весь ролик, некоторые моменты для себя подчеркнул, вью показался намного проще реакта
По ангуляру будет похожее?
composition не только более современный. но и более производительный.
Про функции в пропсах:
это плохая практика, т.к. могут быть исключительные кейсы, типа асинхронных компонентов или сср. Функция не является thread-safe значением, что допускает вероятность потери референса. Рефлексия позволяет сериализовать-десериализовать значения объектов, но функция никак не может быть десериализована после сериализации
Отличный курс, посмотрел на одном дыxании! Будет видео по Pinia?
373 Casper Prairie
Здравствуйте) очень классный качественный материал, отлично объясняете)
Только возник вопрос.. я не понимаю почему добавляю в избранное, но с перезагрузкой страницы отметка сбрасывается, а в мокки запись остается… и удалить оттуда выходит только вручную, потому что состояние кнопки избранного сброшено при перезагрузке страницы… что с этим делать, пишу все как у вас