Создадим приложение для отображения погодных данных по заданному городу с использованием 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 в разработке интерактивных веб-приложений.