11 основ JavaScript для разработчиков Vue
Изучите 11 ключевых основ JavaScript, необходимых для успешной разработки на Vue.
Начните с основ
С появлением ИИ и некоторых влиятельных лиц в области технологий, похоже, многие пропускают основы перед использованием фреймворка в стране Javascript. Понимание основных концепций JavaScript имеет решающее значение, это как научиться ходить, прежде чем бегать. Когда я получил эту новую работу и мне нужно было хорошо разбираться в Vue, я потратил время на то, чтобы просмотреть эти JavaScript, чтобы иметь эффективный подход к разработке Vue 3, я понимаю и могу использовать React ... но это НЕ мой любимый фреймворк, это тема для другого обсуждения. Вот почему эти основы важны:
Переменные и типы данных
- Почему это важно : Система реактивности Vue 3 во многом зависит от правильного объявления переменных.
- API композиции требует понимания
const
рефов и реактивных объектов. - Распознавание типов помогает при рендеринге шаблонов Vue3 и проверке свойств.
const count = ref(0)
const user = reactive({
name: 'John',
age: 30
})
Шаблонные литералы
- Почему это важно : Это важно для выражений шаблонов Vue3 и интерполяции строк.
- Он широко используется в вычисляемых свойствах и методах.
- Шаблонные литералы могут быть полезны для динамических шаблонов компонентов и значений свойств.
const greeting = computed(() => `Hello, ${user.name}!`)
Стрелочные функции
- Почему это важно : Критически важно для Composition API Vue 3.
- Используется в
setup()
функциях, вычисляемых свойствах и наблюдателях. - Необходим для поддержания правильного
this
связывания методов.
const doubleCount = computed(() => count.value * 2)
watch(() => user.name, (newValue, oldValue) => {
console.log(`Name changed from ${oldValue} to ${newValue}`)
})
Объекты и деструктуризация объектов
- Почему это важно : Основополагающий элемент для работы с реактивными объектами Vue.
- Требуется для деклараций свойств компонентов и источников.
- Необходим для деструктуризации
setup()
возвратов.
export default {
setup(props, { emit }) {
const { title, description } = props
return { title, description }
}
}
Массивы и методы массивов
- Почему это важно : Критически важно для рендеринга списков с помощью
v-for
. - Необходим для реактивной обработки данных.
- Используется в вычисляемых свойствах для преобразования данных.
<template>
<ul>
<li v-for="item in filteredItems" :key="item.id">{{ item.name }}</li>
</ul>
</template>
<script setup>
const items = ref([/* ... */])
const filteredItems = computed(() =>
items.value.filter(item => item.isActive)
)
</script>
Promises и async/await
- Почему это важно : имеет решающее значение для загрузки данных
setup()
. - Требуется для асинхронных операций компонентов.
- Необходим для хуков и наблюдателей жизненного цикла.
import { onMounted } from 'vue'
export default {
async setup() {
const data = ref(null)
onMounted(async () => {
data.value = await fetchData()
})
return { data }
}
}
Модули и экспорты
- Почему это важно : имеет основополагающее значение для организации компонентов.
- Требуется для компонуемых объектов и плагинов.
- Необходим для поддержания чистоты архитектуры.
// useCounter.js
import { ref } from 'vue'
export function useCounter() {
const count = ref(0)
const increment = () => count.value++
return { count, increment }
}
// Component.vue
import { useCounter } from './useCounter'
export default {
setup() {
const { count, increment } = useCounter()
return { count, increment }
}
}
Классы и объектно-ориентированные концепции
- Почему это важно : Полезно для понимания наследования компонентов.
- Используется в реализациях пользовательских директив.
- Ценно для комплексного государственного управления.
class BaseComponent {
constructor(name) {
this.name = name
}
sayHello() {
console.log(`Hello from ${this.name}`)
}
}
class SpecialComponent extends BaseComponent {
constructor(name, special) {
super(name)
this.special = special
}
}
Optional Chaining
- Почему это важно : Необходимо для безопасного доступа к объектам в шаблонах.
- Полезно в вычисляемых свойствах.
- Полезно для обработки асинхронных состояний данных.
<template>
<div>{{ user?.profile?.name }}</div>
</template>
<script setup>
const user = ref(null)
const userName = computed(() => user.value?.profile?.name ?? 'Guest')
</script>
Event Handling (Обработка событий)
- Почему это важно : Критически важно для коммуникации компонентов.
- Требуется для управления событиями DOM.
- Необходим для реализации пользовательских событий.
<template>
<button @click="handleClick">Click me</button>
</template>
<script setup>
import { defineEmits } from 'vue'
const emit = defineEmits(['custom-event'])
function handleClick() {
emit('custom-event', { data: 'Some data' })
}
</script>
Error Handling (Обработка ошибок)
- Почему это важно : Важно для границ погрешности компонентов.
- Критически важно для вызовов API и асинхронных операций.
- Необходимо для поддержания стабильности приложения.
import { onErrorCaptured } from 'vue'
export default {
setup() {
onErrorCaptured((error, instance, info) => {
console.error('Captured error:', error, instance, info)
// Handle or report error
return false // Prevent error from propagating further
})
async function fetchData() {
try {
const response = await api.getData()
// Process data
} catch (error) {
console.error('Error fetching data:', error)
// Handle error (e.g., show user-friendly message)
}
}
return { fetchData }
}
}
Эти фрагменты кода демонстрируют практическое применение каждой концепции в контексте разработки Vue 3, предоставляя разработчикам конкретные примеры для понимания и применения этих фундаментальных навыков JavaScript.
Практическое применение основных концепций JavaScript
Чтобы проиллюстрировать, как эти основные концепции JavaScript используются в широко используемых сценариях для начинающих, давайте рассмотрим три мини-проекта: приложение погоды, средство смены цвета фона и приложение todo. Эти примеры продемонстрируют практическое применение обсуждаемых нами концепций.
Приложение «Погода»
const apiKey = 'YOUR_API_KEY';
const cityInput = document.getElementById('cityInput');
const getWeatherBtn = document.getElementById('getWeatherBtn');
const weatherInfo = document.getElementById('weatherInfo');
// Async function declaration
async function getWeather(city) {
try {
// Async/await for API call
const response = await fetch(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`);
// Async/await for parsing JSON
const data = await response.json();
// Template literal for string interpolation
// DOM manipulation
weatherInfo.innerHTML = `
<h2>${data.name}</h2>
<p>Temperature: ${data.main.temp}°C</p>
<p>Description: ${data.weather.description}</p>
`;
} catch (error) {
// Error handling
console.error('Error fetching weather data:', error);
weatherInfo.innerHTML = '<p>Failed to fetch weather data. Please try again.</p>';
}
}
// Event listener
getWeatherBtn.addEventListener('click', () => getWeather(cityInput.value));
Основные реализованные концепции:
- Async/Await : для обработки асинхронных вызовов API.
- Fetch API : для получения данных о погоде из внешнего сервиса.
- Манипулирование DOM : для динамического обновления HTML-контента.
- Шаблонные литералы : для легкой интерполяции строк и многострочных строк.
- Обработка ошибок : использование try/catch для управления потенциальными ошибками во время операции выборки.
Изменение цвета фона
const colorBtn = document.getElementById('colorBtn');
const colorDisplay = document.getElementById('colorDisplay');
// Arrow function
const generateRandomColor = () => {
// Math object usage
const r = Math.floor(Math.random() * 256);
const g = Math.floor(Math.random() * 256);
const b = Math.floor(Math.random() * 256);
// Template literal
return `rgb(${r}, ${g}, ${b})`;
};
// Event listener with arrow function
colorBtn.addEventListener('click', () => {
const newColor = generateRandomColor();
// DOM manipulation
document.body.style.backgroundColor = newColor;
colorDisplay.textContent = newColor;
});
Основные реализованные концепции:
- Стрелочные функции : для кратких выражений функций.
- Математический объект : для генерации случайных значений RGB для цветов.
- Шаблонные литералы : для построения строки RGB.
- Прослушиватели событий : для обработки взаимодействий пользователя (нажатий кнопок).
- Манипуляции с DOM : изменение цвета фона и отображение текущего цвета.
Приложение «Список дел»
const todoForm = document.getElementById('todoForm');
const todoInput = document.getElementById('todoInput');
const todoList = document.getElementById('todoList');
// Local storage usage
let todos = JSON.parse(localStorage.getItem('todos')) || [];
// Arrow function
const renderTodos = () => {
// Array method (map)
// Template literal
todoList.innerHTML = todos.map((todo, index) => `
<li>
${todo}
<button onclick="removeTodo(${index})">Delete</button>
</li>
`).join('');
};
// Event handling function
function addTodo(e) {
e.preventDefault();
const newTodo = todoInput.value.trim();
if (newTodo) {
// Array method (push)
todos.push(newTodo);
// Local storage
localStorage.setItem('todos', JSON.stringify(todos));
todoInput.value = '';
renderTodos();
}
}
// Array manipulation
function removeTodo(index) {
// Array method (splice)
todos.splice(index, 1);
// Local storage
localStorage.setItem('todos', JSON.stringify(todos));
renderTodos();
}
// Event listener
todoForm.addEventListener('submit', addTodo);
renderTodos();
Основные реализованные концепции:
- Локальное хранилище : для сохранения задач между сеансами.
- Методы массива : используются
map
для рендеринга иpush
/splice
для изменения списка дел. - Стрелочные функции : для краткого синтаксиса функций.
- Обработка событий : для управления отправкой форм и нажатиями кнопок.
- Шаблонные литералы : для динамической генерации HTML-разметки.
Эти мини-проекты иллюстрируют, как основные концепции JavaScript объединяются в практических приложениях. Они демонстрируют асинхронное программирование, манипуляцию DOM, обработку событий, методы массивов и многое другое, предоставляя ощутимый контекст для понимания вышеуказанных основных фундаментальных навыков JavaScript перед тем, как приступить к разработке на Vue3.js.