Vue.js с нуля: Приложение погоды с API

Создадим приложение для отображения погодных данных по заданному городу с использованием Vue.js и внешнего API. Проект будет создаваться поэтапно.

Начало работы: Подключение CSS и базовые стили

Создадим файл main.css в папке assets с базовыми стилями: нулевые отступы и поля для всех элементов (margin: 0; padding: 0;), ширину и минимальную высоту для тега <body> (100%), и красный цвет фона. Подключим файл к проекту в main.js:

import './assets/main.css'

Заменим красный фон на градиент (например, с сайта CSS Gradient). Добавим стили Flexbox: display: flex; justify-content: center; align-items: center; для центрирования элементов внутри <body>.

Создание основного компонента

В app.vue создадим основной компонент: <div> с классом wrapper, содержащий заголовок <h1>Погодное приложение</h1> и абзац <p>Узнать погоду в вашем городе</p>. Стилю wrapper зададим ширину 900px, высоту 500px, скругленные углы (border-radius: 50px), фоновый цвет, внутренние отступы (padding: 20px;), центрирование заголовка и белый цвет текста для него. Добавим отступ сверху для абзаца (margin-top: 20px).

<template>
  <div class="wrapper">
    <h1>Погодное приложение</h1>
    <p>Узнать погоду в вашем городе</p>
  </div>
</template>

<style scoped>
.wrapper {
  width: 900px;
  height: 500px;
  border-radius: 50px;
  background: /* ваш градиент */;
  padding: 20px;
}
h1 {
  text-align: center;
  color: white;
  margin-top: 50px;
}
p {
  margin-top: 20px;
}
</style>

Добавление инпута, кнопки и обработчиков событий

Добавим <input type=»text»> для ввода города, кнопку <button>Получить погоду</button> и обработчики событий. Стилю <input> добавим отступ сверху, прозрачный фон, обводку снизу, цвет и размер текста, а также стили focus. Кнопке добавим стили, включая эффект наведения курсора.

<template>
  <div class="wrapper">
    <h1>Погодное приложение</h1>
    <input type="text" v-model="city">
    <button @click="getWeather">Получить погоду</button>
    <p v-if="city">Узнать погоду в "{{ cityName }}"</p>
    <p v-else>Узнать погоду в вашем городе</p>
    <p class="error" v-if="error">{{ error }}</p>
    <div v-if="info">
        <p>Температура: {{ showTemperature }}</p>
        <p>Ощущается как: {{ showFeelsLike }}</p>
        <p>Мин. температура: {{ showMinTemp }}</p>
        <p>Макс. температура: {{ showMaxTemp }}</p>
    </div>
  </div>
</template>

Работа с данными и computed свойства

В секции <script> используем data(), methods и computed свойства Vue.js. data() содержит переменные: city, error и info. methods содержит метод getWeather для получения данных с API. computed свойства cityName, showTemperature, showFeelsLike, showMinTemp, showMaxTemp обрабатывают и форматируют данные о погоде.

<script>
import axios from 'axios';

export default {
  data() {
    return {
      city: '',
      error: '',
      info: null,
    };
  },
  computed: {
    cityName() {
      return '"' + this.city.trim() + '"';
    },
    showTemperature() {
      return this.info ? this.info.main.temp : '';
    },
    showFeelsLike() {
      return this.info ? this.info.main.feels_like : '';
    },
    showMinTemp() {
      return this.info ? this.info.main.temp_min : '';
    },
    showMaxTemp() {
      return this.info ? this.info.main.temp_max : '';
    },
  },
  methods: {
    getWeather() {
      this.error = '';
      const trimmedCity = this.city.trim();
      if (trimmedCity.length < 2) {
        this.error = 'Название города должно быть больше одного символа';
        return false;
      }
      axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${trimmedCity}&appid=YOUR_API_KEY&units=metric`)
        .then(response => {
          this.info = response.data;
        })
        .catch(error => {
          this.error = 'Ошибка при получении данных';
        });
    },
  },
};
</script>

Замените YOUR_API_KEY на ваш собственный API ключ от OpenWeatherMap.

Создано функциональное приложение для получения и отображения данных о погоде, используя Vue.js и внешний API. Рассмотрена работа с данными, обработка событий, стилизация и использование computed свойств. Пример демонстрирует возможности Vue.js в разработке интерактивных веб-приложений.

Что будем искать? Например,программа