Vue 3 for Beginners / Developing an Internet Store for Vue Sneakers

Posted by


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!

0 0 votes
Article Rating
44 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@ArchakovBlog
1 month ago

Благодарю всех за фидбек и тех поддержал в Boosty! Курс опубликован, ссылки на все ресурсы указаны в описании 👇

Если вы хотите задеплоить приложение, советую использовать Vercel (сделал туториал: https://youtu.be/dnfdrvuHFks)

P.S.: Где-то с 6 часов в видео микрофон начал тупить и, к сожалению, я не проверил этот момент, за что прошу заранее извинить и понять 🥲

Если вы обратите внимание на календарь, то одна часть идёт в 22 октября, другая продолжается 3 ноября. За это время успел заболеть, забыть о курсе на неделю, перенастраивал микрофон для рабочих созвонов, в последствии слышны дэбильные шумы как из мемов с усиленным звуком.

@gagarin-d
1 month ago

Спасибо!

@Saynadam
1 month ago

Вьёрстку 1:02:33

@itCats-school
1 month ago

Про разницу props и emits. Передавая функцию в props вы даёте не только право её вызова, но и право её распространения. Например, вы хотите, чтобы счётчик мог увеличивать только один компонент. Вы передаёте ему props с функцией увеличения счётчика. А он эту функцию берёт и отдаёт следующему компоненту, тот ещё куда-нибудь эту функцию отдаёт. В итоге половина компонентов сайта может увеличивать счётчик, и мы теперь в душе не понимаем, что на наш любимый счётчик повлияло и почему он такой большой.

@RailGainetdinov
1 month ago

Отличный курс!!! Жду когда будет курс по Vue с применением state-менеджера и Nuxt!!!

@r3yuk682
1 month ago

net

@DanilapRock
1 month ago

Спасибо за курс!👍

@ДмитрийСеверин-в7е
1 month ago

смотри мне по апи сейчас дали данные на инет магазин . зачем мне это делать на локалке сразу на хомте ж лучше писать и работать с апи

@ДмитрийСеверин-в7е
1 month ago

хорошо объясняешь. только к примеру мне надо с ральными данными работать которые приходят не на локалке а на хосте.

@agamurat3019
1 month ago

privet bratok, turn on autosave please, balshoy privet iz turkmenistan, ashkabat

@only.shorts601
1 month ago

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>

@ЕвгенийДектерев-у4р
1 month ago

это не vuejs это курс по tailwindcss который нормально не работает!!!

@ГриффинШоу
1 month ago

Пожалуйста, не произноси "Vite" как "White"

@dimon90000
1 month ago

Имба, посмотрел весь ролик, некоторые моменты для себя подчеркнул, вью показался намного проще реакта

@AlexKato-y7k
1 month ago

По ангуляру будет похожее?

@AlexKato-y7k
1 month ago

composition не только более современный. но и более производительный.

@TheRuslan6446
1 month ago

Про функции в пропсах:
это плохая практика, т.к. могут быть исключительные кейсы, типа асинхронных компонентов или сср. Функция не является thread-safe значением, что допускает вероятность потери референса. Рефлексия позволяет сериализовать-десериализовать значения объектов, но функция никак не может быть десериализована после сериализации

@iiiaatt
1 month ago

Отличный курс, посмотрел на одном дыxании! Будет видео по Pinia?

@YaekoBratz
1 month ago

373 Casper Prairie

@horikeisukke_7949
1 month ago

Здравствуйте) очень классный качественный материал, отлично объясняете)
Только возник вопрос.. я не понимаю почему добавляю в избранное, но с перезагрузкой страницы отметка сбрасывается, а в мокки запись остается… и удалить оттуда выходит только вручную, потому что состояние кнопки избранного сброшено при перезагрузке страницы… что с этим делать, пишу все как у вас