В последнее время меня часто спрашивают, почему мы решили реализовать первый продукт нашей компании на Vue.js. Не у всех была возможность изучить Vue.js, поэтому я подумал, что было бы полезно написать краткое введение в Vue.js, предоставив пример.

Рисование графики может быть не самым популярным вариантом использования Vue.js, но в этом посте я хотел привести пример, который, как я надеялся, понравится другим - пиксельная графика Super Mario (вдохновленная Пикселями данных), которая рисует с пиксельная графика и обновляет цвета, используя реактивность Vue.js при нажатии на пиксель. Вы можете найти весь код в моем репозитории.

Планирование

Перед тем, как начать писать код, я планировал создать два компонента Vue для реализации этого рисунка:

Пиксель - это компонент pixel.vue, принимающий значения RGB и размер пикселя. Это div (вместо элемента HTML canvas) и будет генерировать событие, когда по нему щелкают, чтобы уведомить его родительский компонент.

Canvas ( canvas.vue) - это контейнер, который инициализирует пиксельные компоненты на основе двухмерного массива с цветами каждого пикселя.

pixel.vue

.vue файл может содержать блоки шаблонов, стилей JavaScript и CSS, поэтому весь необходимый код для компонента может существовать в одном файле.

В теге script color (background color) и size(pixel size) - обязательные свойства (реквизиты), передаваемые при инициализации компонента. Если указывать type и required в props нет необходимости, его можно упростить до props: ['color', 'size']. Значения свойств применяются к pixelStyle() вычисляемому свойству, которое привязано к div.style. Если значение свойства color изменится, оно будет распространено на шаблон через вычисляемое свойство, а фон div.l-pixel будет обновлен. v-bind: (полный синтаксис) или : (сокращение) используется для привязки свойства или данных в шаблоне. Распространение такое:

color change in canvas.vue >>> "color" in "props" in pixel.vue >>> "pixelStyle()" in "computed" >>> style attribute of "div.l-pixel" in "<template>" 

v-on: (полный синтаксис) или @ (сокращение) используется для привязки обработчика событий, а событие щелчка div.l-pixel привязано к onPixelClick в методах. Метод сгенерирует событие pixel-click с информацией о цвете, которую будет прослушивать компонент холста.

main.js

Главный файл JavaScript инициализирует компонент canvas.vue, и здесь мы можем видеть данные, предоставленные для свойств canvas.vue. this.pixelData содержит произвольные названия цветов пикселей, а this.colors - это словарь цветов (объект JavaScript) для включения значений RGB. (Его можно улучшить, создав class Color,, который содержит как название цвета, так и информацию RGB.)

canvas.vue

Он отображает пиксели с pixelData, переданным из main.js с использованием v-for.

<div v-for="(row, rowIndex) in pixelData" :key="rowIndex" :style="{height: pixelSize}">
    <n-pixel v-for="(col, colIndex) in row" :key="colIndex" :color="colors[col]"
             :size="pixelSize" @pixel-click="onPixelClick">
    </n-pixel>
</div>

Компонент pixel зарегистрирован с component: { NPixel },, который является эквивалентом components: {'n-pixel': NPixel}, а префикс n- используется для предотвращения конфликта имен компонентов на тот случай, если pixel уже зарегистрирован как глобальный компонент.

В <n-pixel v-for, col - это имя цвета (например, «C», «_»), которое происходит от main.js, а :color="colors[col]" отправляет значение RGB (например, «255, 255, 255») в компонент pixel. colIndex - это индекс текущего элемента (0, 1, 2,…). Он передается в атрибут key, который Vue.js требует уникального значения для v-for.

@pixel-click="onPixelClick" слушает событие pixel-click от компонента pixel и onPixelClick меняет цвет в словаре (объект JavaScript, this.colors, вместо того, чтобы перебирать весь двумерный массив this.pixelData, и в результате реакции цвета фона пикселей обновляются!

Следующий

Если вы хотите продолжить изучение Vue.js, я бы порекомендовал прочитать некоторые из их замечательных документов. Также есть отличная бесплатная серия видео - Learn Vue 2: Step By Step в Laracast. На мой взгляд, всегда полезно написать небольшое приложение, чтобы лучше понять библиотеку или фреймворк. Вы можете найти интересную тему или преобразовать часть вашего предыдущего кода в новую библиотеку. Хотя всегда полезно читать документы, чтобы узнать больше, преимущества и недостатки различных библиотек или фреймворков часто легче увидеть, когда вы начнете писать код.