原文出处:Quick Introduction to Vue.js — Super Mario Pixel Art

::代码我已经归纳在github上:【vue2-pixel-art::
::__查看【Demo__::

最近有人问我为什么选择使用Vue.js来实现我们公司的第一款产品。哈哈哈,并不是每个人都有机会去探索Vue.js的;使用在这里,我先可以通过写一个简简单单的Vue.js例子来快速介绍它,将让大家对Vue.js有着很好认识和了解,希望这些能给大家有所帮助。

绘制图形可能不是Vue.js最受欢迎的用例,甚至很多市场上的Demo都很少有关绘制图形的;但在这篇文章中,我想用绘制图形来举一个例子,我想其他人已经在github上发现这个非常乐趣并好玩的动sai -- 超级马里奥像素艺术(灵感来自GithubData-Pixels),它绘制许多像素,当点击其中一个像素时,周边相似的都会随之而改变。
哦,我们这里不是使用canvas来说实现的,是使用了div。

在这里我使用了Vue.js来改写,用Vue.js的方法来绘制和更新颜色,感觉超级棒棒的。

构建两个Vue组件

在开始编写代码之前,我就构建了两个Vue组件来实现这个图形:

  • pixel.vue
    pixel.vue是一个组件(这里放着每个小小像素单位);参数有color(RGB值)和size(像素大小)的两个数据,当它被点击并触发事件,就是通知其父组件并也将会触发一个事件。
  • canvas.vue
    是一个基于具有每个像素的颜色的二维数组初始化像素分量的容器。

pixel.vue

<template>
<div class="l-pixel" :style="pixelStyle" @click="onPixelClick">
</div>
</template> <script>
export default {
props: { // could be "props: ['color', 'size']" if there no need for "type" and "required".
color: {
// RGB color - i.e. "255, 255, 255"
// applied in "pixelStyle()" computed data
type: String,
required: true,
},
size: {
type: String,
required: true
}
},
computed: {
pixelStyle() { // style binding in template
return {
'background-color': `rgb(${this.color})`, // this.color is "color" in "props"
'width': this.size,
'height': this.size
}
}
},
methods: {
onPixelClick() { // click event handler
this.$emit('pixel-click', this.color)
}
}
}
</script> <style scoped>
.l-pixel {
display: inline-block;
}
</style>

.vue 文件可以包含template模板、JavaScript和CSS样式块,因此组件的所有必需代码都可以存在于单个文件中。

在script标签中,color(background color)和size(pixel size)是组件初始化时传递的必需属性(props)。

如果没有必要指定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:(完整语法)或@(简写)用于绑定事件处理程序,并且click方法中div.l-pixel绑定的click事件onPixelClick。

该方法将pixel-click使用其颜色信息发布事件,画布组件将侦听该颜色信息。

main.js

import Vue from 'vue';
import NCanvas from 'canvas'; new Vue({
components: {NCanvas},
el: '#main-canvas',
template: '<n-canvas :pixel-data="pixelData" :colors="colors" background="rgb(229, 230, 232)"></n-canvas>',
data() {
return {
pixelData: null,
colors: null
}
},
created() {
const C = "C"; //Hat & Shirt
const B = "B"; //Brown Hair & Boots
const S = "S"; //Skin Tone
const O = "O"; //Blue Overalls
const Y = "Y"; //Yellow Buckles
const W = "W"; //White Gloves
const _ = "_";
this.pixelData = [
[_, _, _, _, _, _, _, _, _, _, _, _, _, _],
[_, _, _, _, C, C, C, C, C, _, _, _, _, _],
[_, _, _, C, C, C, C, C, C, C, C, C, _, _],
[_, _, _, B, B, B, S, S, B, S, _, _, _, _],
[_, _, B, S, B, S, S, S, B, S, S, S, _, _],
[_, _, B, S, B, B, S, S, S, B, S, S, B, _],
[_, _, B, B, S, S, S, S, B, B, B, B, _, _],
[_, _, _, _, S, S, S, S, S, S, S, _, _, _],
[_, _, _, C, C, O, C, C, C, C, _, _, _, _],
[_, _, C, C, C, O, C, C, O, C, C, C, _, _],
[_, C, C, C, C, O, O, O, O, C, C, C, C, _],
[_, W, W, C, O, Y, O, O, Y, O, C, W, W, _],
[_, W, W, W, O, O, O, O, O, O, W, W, W, _],
[_, W, W, O, O, O, O, O, O, O, O, W, W, _],
[_, _, _, O, O, O, _, _, O, O, O, _, _, _],
[_, _, B, B, B, _, _, _, _, B, B, B, _, _],
[_, B, B, B, B, _, _, _, _, B, B, B, B, _]]; this.colors = {
[C]: "255, 0, 0",
[B]: "100, 50, 0",
[S]: "255, 200, 150",
[O]: "0, 0, 255",
[Y]: "255, 255, 0",
[W]: "255, 255, 255",
[_]: "229, 230, 232"};
}
});

像素初始化的代码写在canvas.vue组件里,在这里,我们可以看到为canvas.vue属性提供的数据。this.pixelData包含任意颜色的像素名称,this.colors是包含RGB值的颜色字典(JavaScript对象)。(可以通过创建class Color,包含颜色名称和RGB信息来修改)。

canvas.vue

<template>
<div class="l-canvas-container" :style="{background: background}">
<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>
</div>
</template> <script> import NPixel from 'pixel'; export default {
components: {NPixel},
props: {
pixelData: {type: Array, required: true},
colors: {type: Object, required: true},
pixelSize: {type: String, default: '20px'},
background: {type: String, default: 'white'}
},
methods: {
onPixelClick(color) {
let newColor = this.getRandomColor();
let colors = this.colors;
for(let c in colors) {
if (colors[c] === color) {
colors[c] = newColor;
}
}
},
getRandomColor() {
return this.getRandom() + ', ' + this.getRandom() + ', ' + this.getRandom();
},
getRandom() {
return Math.floor(Math.random() * 256);
}
}
}
</script> <style scoped>
.l-canvas-container {
background: rgb(229, 230, 232);
width: 280px;
margin: 0 auto;
margin-top: 50px;
height: 340px;
}
</style>

从main.js中使用了v-for来渲染pixelData。

<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,我建议您继续阅读他们的文章,甚至可以去看官方api并且自己动手写更多东西。还有一个很不错的免费系列视频 - []()学习拉拉斯卡特的 Learn Vue 2: Step By Step(Vue 2:一步一步)

在我看来,使用Vue.js来编写一些小应用程序来更好地了解库或框架,这样对你很有帮助的。您可以找到一个有趣的Demo或将您以前的代码的一部分转换为新的库。在你提炼了自己的代码之后,您会发现不同库或框架转换并非是件容易的事情,尤其对比了它们的优点和缺点通常不是一下子就能理清楚的。

加油!!!!

本文转载于:猿2048➩https://www.mk2048.com/blog/blog.php?id=h12aaakaaaa

Vue.js快速介绍-超级马里奥像素艺术的更多相关文章

  1. Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)

    Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二) 前言 上篇文章对Vue.js有了初步理解,接下来我们把Vue.js基础语法快速的过一遍,先混个脸熟留个印象就 ...

  2. 【入门篇】前端框架Vue.js知识介绍

    一.Vue.js介绍 1.什么是MVVM? MVVM(Model-View-ViewModel)是一种软件架构设计模式,它源于MVC(Model-View-Controller)模式,它是一种思想,一 ...

  3. Vue.js 快速入门

    什么是Vue.js vue是法语中视图的意思,Vue.js是一个轻巧.高性能.可组件化的MVVM库,同时拥有非常容易上手的API.作者是尤雨溪,写下这篇文章时vue.js版本为1.0.7 准备 我推荐 ...

  4. Vue.js快速入门

    Vue.js介绍 Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们 ...

  5. Vue.js—快速入门

    Vue.js是什么 Vue.js 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目 ...

  6. Vue.js——快速入门

    Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的.相比于Angular.js,Vue.js提供了更加简洁.更易于理解的API,使得我们能够快速地上手并使 ...

  7. Vue.js—快速入门及实现用户信息的增删

    Vue.js是什么 Vue.js 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目 ...

  8. 可能是目前最完整的前端框架 Vue.js 全面介绍

    Vue.js 是一个JavaScriptMVVM库,是一套构建用户界面的渐进式框架. 摘要 2016年最火的前端框架当属Vue.js了,很多使用过vue的程序员这样评价它,“vue.js兼具angul ...

  9. 转载: 我如何使用 Django + Vue.js 快速构建项目

    原文链接: https://www.ctolib.com/topics-109796.html 正文引用如下 引言 大U的技术课堂 的新年第一课,祝大家新的一年好好学习,天天向上:) 本篇将手把手教你 ...

随机推荐

  1. MySQL第一讲概论

    MySQL 后期内容 Python 今日内容概要 MySQL的概念 数据库软件的安装及使用 配置文件介绍 数据库常用命令(库操作.表操作.记录操作) 今日内容详细 什么是数据库 1.单机游戏 本地保存 ...

  2. python 编辑器提示 do not use bare except

    在捕获异常时,应该尽可能指定特定的异常,而不是只使用 except 语句. 比如说,except 语句会捕获 KeyboardInterrupt 和 SystemExit 异常,但 KeyboardI ...

  3. Dubbo服务框架和spring-cloud架构的优缺点

    Dubbo一.dubbo简介 Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成. Dubbo是一款高性能.轻 ...

  4. 在 k8s 以外的分布式环境中使用 Dapr

    在Dapr 文档和实践案例中多是推荐采用k8s, 其实我目前也是在k8s 上操作的,有公有云TKE,AKS,还有私有云的Rancher ,它并没有传闻中的那么难,而且我认为它非常容易上手.不过,我还是 ...

  5. SQL从零到迅速精通【实用函数(3)】

    1.LOWER()函数 使用LOWER函数将字符串中所有字幕字符转换为小写,输入语句如下. SELECT LOWER('BEAUTIFUL'),LOWER('Well'); 2.UPPER()函数 S ...

  6. centos7 安装mysql Package: akonadi-mysql-1.9.2-4.el7.x86_64 (@anaconda)

    wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release ...

  7. 网络IO模型 非阻塞IO模型

    网络IO模型 非阻塞IO模型 同步 一件事做完后再做另一件事情 异步 同时做多件事情 相对论 多线程 多进程 协程 异步的程序 宏观角度:异步 并发聊天 阻塞IO 阻塞IO的问题 一旦阻塞就不能做其他 ...

  8. PhpMyadmin后台拿webshell方法总结

    前言: phpmyadmin后台拿webshell的方法主要分为两个方法: (1) .通过日志文件拿webshell; (2) .利用日志文件写入一句话;(这个方法可能在实际操作中会遇到困难): 本地 ...

  9. 西门子S210电机位置控制过调问题解决方法

    问题描述 创建完工艺对象,使用MC_MoveAbsolute工艺指令进行绝对定位,发现在下达指令后,电机会出现先超过目标位置再回调的现象,即过冲. 电机连接的机械结构为旋转轴,而不是线性轴. 解决方法 ...

  10. python方面

    (113条消息) re.sub()用法的详细介绍_jackandsnow的博客-CSDN博客_re sub Python slice() 函数 | 菜鸟教程 (runoob.com) (111条消息) ...