(译文)开始学习Vue——构建你的第一个Vue应用
我们要构建如下组件:(最终代码在这里:https://codesandbox.io/s/38k1y8x375)

开始
Vue是支持单文件组件的,但是我们不准备这么做。你也可以构建一个全局的组件,通过Vue.component,但是我们也不准备这么做。
我们希望跟在真实项目中一样,构建一个可被编译的,可维护的组件。
首先安装:
npm install -g vue-cli
vue init webpack-simple path/to/my-project
(“Use sass”,回答Y,其他默认)
然后切换到工程:
cd path/to/my-project
npm install
npm run dev
webpack会在浏览器打开你的组件,端口是8080:

为了调试Vue组件,你需要在浏览器装一下插件:Vue devtools(chrome的扩展插件)

第一个组件
单文件是这么写的,.vue后缀的文件:
<template>
<!-- Your HTML goes here -->
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>
</template>
<script>
/* Your JS goes here */
</script>
<style>
/* Your CSS goes here */
</style>
我们在目录/src/components下:创建一个文件:Rating.vue,然后拷贝上面的代码。
然后打开/src/main.js,按如下修改:
import Vue from 'vue'
import Rating from './components/Rating'
new Vue({
el: '#app',
template: '<Rating/>',
components: { Rating }
})
然后打开浏览器,你可以看到变化。
你注意到,你不需要刷新页面。这是因为 vue-loader (webpack的loader)的热更新作用,你修改组件,只会刷新组件,不会刷新整个页面。
模板
安装如下,因为我们需要使用SVG 图标:
npm install vue-awesome
然后修改模板:
<template>
<div>
<ul>
<li><icon name="star"/></li>
<li><icon name="star"/></li>
<li><icon name="star"/></li>
<li><icon name="star-o"/></li>
<li><icon name="star-o"/></li>
</ul>
<span>3 of 5</span>
</div>
</template>
<script>
import 'vue-awesome/icons/star'
import 'vue-awesome/icons/star-o'
import Icon from 'vue-awesome/components/Icon'
export default {
components: { Icon }
}
</script>
解释一下:
Vue.js采用ES6模块的方式导入模块和导出模块。
上面的Icon是Vue的单文件组件,就像我们上面自己构建的组件一样。
export default是导出了一个对象,作为View Modal。导出了Icon供模板使用。
注意:Vue只支持单元素root,所以必须包一层div
样式
CSS有一个不好的地方就是全局污染,你需要想办法隔离,重写不方便,复用和扩展都很难。
一直以来我们都采用BEM方案,命名class的类名。
现在,Vue和React引入了有作用域的样式。
React是有一个样式组件,Vue有组件范围内的样式。你像往常一样写样式,不用担心污染,Vue会通过赋值给HTML一个data-attributes,并且拼接到样式里面来区别作用域。
<template>
<div class="rating">
<ul class="list">
<li class="star active"><icon name="star"/></li>
<li class="star active"><icon name="star"/></li>
<li class="star active"><icon name="star"/></li>
<li class="star"><icon name="star-o"/></li>
<li class="star"><icon name="star-o"/></li>
</ul>
<span>3 of 5</span>
</div>
</template>
样式:注意style标签上的scoped属性(把样式放到html文件是不起作用的,因为这个样式是给组件用的)
<style scoped>
.rating {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
font-size: 14px;
color: #a7a8a8;
}
.list {
margin: 0 0 5px 0;
padding: 0;
list-style-type: none;
}
.list:hover .star {
color: #f3d23e;
}
.star {
display: inline-block;
cursor: pointer;
}
.star:hover ~ .star:not(.active) {
color: inherit;
}
.active {
color: #f3d23e;
}
</style>
预处理器
只需要在style标签加上:lang="scss"就行了
行为
修改一下代码:
<script>
...
export default {
components: { Icon },
data() {
return {
stars: 3,
maxStars: 5
}
}
}
</script>
<template>
<div class="rating">
<ul class="list">
<li v-for="star in maxStars" :class="{ 'active': star <= stars }" class="star">
<icon :name="star <= stars ? 'star' : 'star-o'"/>
</li>
</ul>
<span>3 of 5</span>
</div>
</template>
说明一下:
1 通过data来设置组件的state:state的修改会反应在view层。
2 data必须返回一个工厂函数,而不是一个对象引用。引用的话会被所有的组件共享,这不是我们要的。
3 v-for是vue的指令,让你遍历。
4 :class是v-bind:class的简写。动态绑定属性到一个表达式。
5 只有当star小于stars时,会应用star class到li上面
数量怎么弄?
<span>{{ stars }} of {{ maxStars }}</span>
当然最好是弄成计算属性:
export default {
...
computed: {
counter() {
return `${this.stars} of ${this.maxStars}`
}
}
}
<span>{{ counter }}</span>
如果不需要数量的话,可以隐藏:
<span v-if="hasCounter">{{ stars }} of {{ maxStars }}</span>
export default {
...
data() {
return {
stars: 3,
maxStars: 5,
hasCounter: true
}
}
}
交互
<template>
...
<li @click="rate(star)" ...>
...
</template>
export default {
...
methods: {
rate(star) {
// do stuff
}
}
}
注意一点:Vue是单向数据流
传递属性:props
现在我们的数据都是写死在我们的组件里面的,因为我们的组件需要被复用。所以希望能从外面传递进来,这个时候就要用到props
export default {
props: ['grade', 'maxStars', 'hasCounter'],
data() {
return {
stars: this.grade
}
},
...
}
main.js:
new Vue({
el: '#app',
template: '<Rating :grade="3" :maxStars="5" :hasCounter="true"/>',
components: { Rating }
})
props和data会在编译期间合并。data和props字段名最好不要一样,因为都是在模板直接使用的,避免混淆。
为什么要把grade赋值给star呢: 因为props是会被修改的,最好使用的时候都复制一份。
最后: prop检验器
export default {
props: {
grade: {
type: Number,
required: true
},
maxStars: {
type: Number,
default: 5
},
hasCounter: {
type: Boolean,
default: true
}
},
...
}
以上就是今天的内容,感谢阅读。
原文链接:https://frontstuff.io/build-your-first-vue-js-component
作者知乎/公众号:前端疯 (一群热爱前端的一线程序员维护,想要用前端改变世界。)

(译文)开始学习Vue——构建你的第一个Vue应用的更多相关文章
- Vue(一) 数据绑定和第一个Vue应用
学习 Vue.js 最有效的方法是查看官网文档 数据绑定和第一个Vue应用 先从一段简单的 HTML 代码开始,感受 Vue.js 最核心的功能. <!DOCTYPE html> < ...
- Vue学习(二) :第一个Vue项目
OS: Windows 10 Home 64bit Chocolatey version: 0.10.13 npm version: 6.4.1 yarn version: 1.16.0 git ve ...
- Windows10安装node.js,vue.js以及创建第一个vue.js项目
[工具官网] Node.js : http://nodejs.cn/ 淘宝NPM: https://npm.taobao.org/ 一.安装环境 1.本机系统:Windows 10 Pro(64位)2 ...
- vue 构建项目vue-cli
1.首先得有node和npm的环境,node的下载:http://nodejs.org/download/.安装node之后,npm也自动生成了,显示版本号就意味着安装成功 2.接下来就是安装vue- ...
- vue 构建项目遇到的请求本地json问题
在本地测试的json没有问题,但是打包后,发现json 的路径不对了,变成了绝对路径 解决方法: 建立的json文件需要放置 根目录/static下.如项目名/static/data.json,这边 ...
- vue 构建项目 文件引入
1.vue引用依赖文件. 举例:axios 先安装 axios.如果直接安装 vue-axios 会报错 npm install axios npm install --save axios vue ...
- Flask & Vue 构建前后端分离的应用
Flask & Vue 构建前后端分离的应用 最近在使用 Flask 制作基于 HTML5 的桌面应用,前面写过<用 Python 构建 web 应用>,借助于完善的 Flask ...
- Vue系列(2):Vue 安装
前言:关于页面上的知识点,如有侵权,请看 这里 . 关键词:小白.Vue 安装.Vue目录结构.Vue 构建页面流程 ? 初学者安装 vue 用什么好 大家都知道,学 Vue 最好还是去官网学,官网写 ...
- Vue.js-07:第七章 - Vue 实例的生命周期
一.前言 在之前的 Vue 学习中,我们在使用 Vue 时,都会创建一个 Vue 的实例,而每个 Vue 实例在被创建时都要经过一系列的初始化过程.例如,需要设置数据监听.编译模板.将实例挂载到 D ...
随机推荐
- 安装WebLogic的详细步骤
安装WebLogic的详细步骤 1.在官网上下载WebLogic,详细地址如下 WebLogic 2.将WebLogic从官网上下载后wls1036_generic.jar 3.双击"wls ...
- 经典面试问题: Top K 之 ---- 海量数据找出现次数最多或,不重复的。
作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...
- ORA-01940: cannot drop a user that is currently connected解决方法
我们在删除数据库用户时候会碰到如下错误 SQL> DROP USER sys_xj cascade; DROP USER sys_xj cascade*ERROR at line 1:ORA-0 ...
- 第十篇:Map/Reduce 工作机制分析 - 数据的流向分析
前言 在MapReduce程序中,待处理的数据最开始是放在HDFS上的,这点无异议. 接下来,数据被会被送往一个个Map节点中去,这也无异议. 下面问题来了:数据在被Map节点处理完后,再何去何从呢? ...
- spring boot redis分布式锁
随着现在分布式架构越来越盛行,在很多场景下需要使用到分布式锁.分布式锁的实现有很多种,比如基于数据库. zookeeper 等,本文主要介绍使用 Redis 做分布式锁的方式,并封装成spring b ...
- 【BZOJ5020】【THUWC2017】在美妙的数学王国中畅游(Link-Cut Tree,组合数学)
[BZOJ5020][THUWC2017]在美妙的数学王国中畅游(Link-Cut Tree,组合数学) 题解 Description 数字和数学规律主宰着这个世界. 机器的运转, 生命的消长, 宇宙 ...
- [BZOJ3293] [Cqoi2011] 分金币 (贪心)
Description 圆桌上坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一些金币,最终使得每个人的金币数目相等.你的任务是求出被转手的金币数量的最小值. Inpu ...
- 使用Ant打包Web前台程序
概述 本文通过一个简单的Web项目作为例子描述如何用ANT完成Web前台程序的打包工作.包含文件拷贝.编译.打包三部分:完成这三部就可以得到一个War了,放到Tomcat下就可以运行了. ANT的安装 ...
- FTP环境搭建及客户代码调用公共方法封装
一.背景 大型系统架构往往被分解为多个独立可运行的组件, 以满足性能.可靠性.可扩展性的需求.多个组件间的数据交互往往采用两种方式:小量数据通过Sock函数.RMI.WebService等接口方式传递 ...
- 安装anaconda与tensorflow
在安装Anaconda之前,有的已经安装过一个Python版本了,但是又不想删除这个Python版本,该怎么办呢? 安装anaconda与tensorflow一条龙 jupyter notebook ...