Vue是现在最流行的前端框架之一,而且相对于其他两个框架React和Angular来说也更加易学,而且它的作者是国人,中文文档也很完善。当然Vue框架算是比较高级的框架,所以在使用过程中还需要JavaScript、JavaScript 2015、WebPack、NodeJS、npm、ESLint、JavaScript单元测试框架等其他知识和框架的使用方法。在学习Vue之前,最好先学习一下这些知识。由于Vue的中文文档比较完善,所以这里只介绍Vue框架的一些核心概念,详细的使用方法还得查看官方文档。
Vue的中文文档可以查看https://cn.vuejs.org/v2/guide/installation.html 。
Vue路由功能需要导入vue-router,它的中文文档可以查看https://router.vuejs.org/zh-cn/ 。
Vue的状态管理功能需要使用vuex,它的中文文档可以查看https://vuex.vuejs.org/zh-cn/ 。
如果需要更多Vue资料,可以查看awesome-vue,列举了很多Vue资源。
首先,我们来抛开那些复杂的框架配置,先从单文件开始学习Vue最基本的内容。这样做很简单,讲下面的代码复制为一个HTML文件,在浏览器中打开即可。这里引用了Vue框架的CDN,所以不需要任何配置即可使用Vue。
Vue单文件例子
Vue框架中最重要的东西就是Vue实例了,它是Vue框架的核心对象。在创建Vue实例的时候需要传入一些参数,el
参数是Vue实例的作用范围;data
参数是Vue实例使用的数据。在Vue实例对应的元素中,我们可以使用模板语法{{var}}
来使用这些数据。
Vue实例
{{data}}
上面已经展示了一个小例子。文本需要写在两对花括号之间。当然这里其实不止可以写单个变量,还可以写组合表达式,例如{{text + new Date()}}
。
所有在构造Vue实例是传入的数据都是可响应的,也就是说只要数据发生改变,那么视图的数据也会发生改变。如果希望数据不发生改变,需要使用v-once
指令。所有v-
开头的都是Vue独有的指令,这些指令将在后面介绍。
有时候需要操作原始HTML,Vue也提供了支持。要插入的HTML代码需要使用v-html
指令来指定,这个指令会将它所在的HTML代码块整个替换为要插入的HTML块。由于可能导致XSS攻击,所以最好不要随便替换HTML块。另外要替换HTML块的话只能使用v-html
指令,如果使用前面的文本插值的话,插入的只是一段文本。
文本插值只能插入文本,如果需要设置和修改HTML属性的话,需要使用v-bind
指令。
下面是一个简单的例子,将它复制到前面的HTML文件中即可看到效果。
模板语法
文本:{{text}}
组合表达式:
只渲染一次的文本:{{text}}
HTML代码:
属性:
有时候程序逻辑比较复杂,可能需要对一个数据进行一些计算和处理。这时候就需要计算属性了。当然由于模板语法支持表达式,所以也可以直接在{{}}
中编写表达式,但是不管从可读性还是可维护的角度来说,计算属性都是更好的选择。
计算属性需要在构造Vue实例的时候传入computed
属性,然后在相应的函数中处理复杂逻辑。计算属性可以向普通属性那样在视图中使用。计算属性有个优点就是惰性求值,下面的例子中,toUpper
计算属性依赖于words
属性,只要words
不发生改变,那么多次访问toUpper
不会重新出发计算,而是会使用已有的结果。只有当words
发生变化时,toUpper
才会相应改变。
计算属性
单词:{{words}}
单词大写:{{toUpper}}
这个指令让视图只渲染一次,将来就算相应的数据发生变化,也不会重新渲染。该指令主要在希望静态显示不需要更新数据的时候使用。
这个指令主要在需要操作原始HTML的时候使用。
该指令在需要绑定HTML标签属性的时候使用。为了方便,该指令还有一个缩写:
,例如:class="myClass"
就相当于v-bind:class="myClass"
。
该指令主要用于绑定事件处理程序。该指令有缩写@
,例如@click="onClick"
就相当于v-on:click="onClick"
。
这几个指令主要用于条件渲染,将在后面进行介绍。
该指令用于渲染整个列表,将在后面进行介绍。
该指令可以让页面元素和数据进行双向绑定。默认情况下数据和页面元素是单向绑定的,使用该指令可以让其变成双向绑定。该指令主要用于处理表单等场景。
v-if、v-else和v-else-if这几个指令用于条件渲染,让我们可以按照条件在页面上显示和隐藏某些元素。注意v-else-if指令是Vue 2.1新增的。类似的指令还有v-show,不过v-show指令仅仅改变元素的CSS display属性,也是说隐藏的元素还是存在于页面上,仅仅是不显示而已。而v-if等元素会真正创建和销毁元素。
这些指令的使用方法很简单,直接看例子就行了。
条件渲染
v-if渲染会实际创建和销毁对象
分数是:
不及格
及格
优秀
v-show仅仅调用CSS display属性
可以看到我
如果需要渲染一组数据,可以使用v-for指令。v-for指令需要一个item in items
块来声明迭代那些数据,这里in
也可以改为of
。如果需要获取迭代的索引的话,可以把迭代块声明为(item, index) in items
这样的。另外除了迭代一个列表,也可以迭代一个对象的属性。
列表渲染
名字列表
- {{name}}
人物表格
编号
姓名
年龄
{{index}}
{{person.name}}
{{person.age}}
v-on指令用于绑定事件处理函数,这里的函数需要在构造Vue实例的时候在methods
属性中声明。
针对键盘按键,Vue还定义了一组按键修饰别名,详情请参考官方文档。下面是一个简单的例子。
事件处理
计数器
{{count}}
获取按键(单击、回车和空格)
如果要将数据和页面元素进行双向绑定,使用v-model指令。这个指令主要用于处理表单输入中。下面是一组表单例子。
绑定表单
文本框:{{text}}
多行文本:{{textArea}}
单选按钮:{{radio}}
复选框:{{checkbox}}
多选框:{{select}}
文本框:
多行文本:
单选按钮:
复选框:
多选框:
在处理表单输入的时候,还有.lazy
、.number
、.trim
几个修饰符,它们的作用分别是在change事件中更新、将表单输入转换为数值以及去掉表单中的前后空格。
前面介绍了Vue的各种功能,但是这些功能并不能直接在项目中使用。因为如果直接使用的话,会导致出现一个非常大的Vue实例,这和将所有代码都写在一个文件的道理是一样的。所以Vue引入了组件来进行模块化功能。
定义组件和定义一个Vue实例类似。不同的是,组件需要有自己的模板,而且组件的data
属性必须是一个函数。原因是假如一个组件在多个地方复用,那么原本的data
属性会导致所有组件实例共用一个属性值。使用函数后,每个组件实例都会有自己独立的数据。更加详细的解释和例子请查看官方文档。
let component1 = {
template: '{{hello}}
',
data() {
return {
hello: 'hello world'
}
}
}
定义好了组件之后,我们还需要在Vue中注册它。第一种方法是全局注册,这样组件就可以在全局范围中使用。
Vue.component('组件标签名', {
//实际组件
})
第二种方法更常见,就是局部注册。将组建注册到局部Vue实例,那么组件只会在该实例的作用域内可见。局部注册需要在创建Vue实例的时候讲组件传入到components
属性中。
let vm8 = new Vue({
el: '#s8',
components: {
'hello-world': component1,
}
})
组件注册完毕之后,我们就可以像使用自定义标签一样使用它了。
如果需要从父组件中传递数据,需要在子组件中声明props
属性制定要传入的数据。
let component1 = {
template: '{{hello}} {{name}}
',
data() {
return {
hello: 'hello world'
}
},
props: [
'name'
]
}
然后就可以像这样传递数据了。
如果需要传递动态数据,使用v-bind
指令即可。
一个完整的例子见下。
组件
hello world组件
从父组件传递数据
动态传递数据
最后来说说Vue的过渡效果,这里只说说最基本的进入离开过渡。Vue还支持更加复杂的状态过渡,如果想了解这些更复杂的知识,请直接查看文档。
Vue封装了一个组件transition
,当其中的组件被插入、删除,或者发生变化的时候,会自动查看这些组件是否应用了过渡CSS类,然后再恰当的时机插入和删除这些类,从而实现过渡效果。过渡类名在官方文档中有介绍,还有一张过渡示意图,这里我就不再介绍了。
比如说我现在需要一个透明度过渡效果。我可以这样编写CSS类。
.v-enter-active {
transition: all 1s;
}
.v-leave-active {
transition: all 1s;
}
.v-enter, .v-leave-to {
opacity: 0;
}
然后用下面的方法使用,就可以看到实际效果了。
按钮过渡
Hello
最简单的办法就是在前面创建模板项目的时候同时选择使用vue-router。如果没有在创建项目是选择vue-router,就需要手动添加到项目中。
下面用前面创建的没有安装vue-router的模板项目做例子来介绍。首先需要安装vue-router并将其添加到package.json
文件中。
npm i -S vue-router
然后创建src/router/index.js
文件,并在其中添加如下代码。这样会在全局注册Vue路由组件。
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export default new Router()
最后在项目入口文件src/main.js
中在全局Vue实例中注册路由。
import Vue from 'vue'
import App from './App'
import router from './router'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
template: ' ',
components: {App}
})
这样Vue路由功能就注册好了。
下面来添加第一个路由。和Vue实例一样,router实例也可以在构造的时候通过参数来配置。首先在路由构造函数中添加路由属性,每个路由都需要有路径、组件名以及实际组件。
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
Vue.use(Router)
export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: HelloWorld
},
],
})
添加好路由之后,为了能让程序随路由变化而显示不同内容,我们还需要使用vue-router预设的组件
,它会在运行的时候替换为我们所定义的组件。在这个例子中,只需要将App.vue
文件中的hello-world
组件替换为router-view
即可。
![](./assets/logo.png)
在使用Vue路由的时候,我们会发现浏览器中的地址长的是这个样子:xxx/#/
。这是Vue路由的默认哈希模式,优点就是兼容性强。还有另外一种模式就是HTML历史模式。要使用这种模式很简单,在构造Vue路由的时候,将mode
参数设置为history
即可。这样一来,浏览器地址栏就会变成正常状态。当然这种模式也有缺点,就是假如后台没配置好,访问某些页面可能会返回404错误。所以具体使用哪种模式还需要自己仔细考虑。
export default new Router({
routes: [
{
path: '/',
name: 'Hello',
component: HelloWorld
},
],
mode: 'history'
})
Vue路由相对于Vue核心框架来说,没什么复杂的概念,基本上很容易理解和上手。所以我这里就不做过多介绍了。官方文档介绍的更加完整。
通过以上学习我们可以看到Vue可以算是一个MVVM框架,主要作用就是将前台页面和数据绑定起来。为了做出漂亮的视觉效果,我们还需要和其他视图框架进行集成。
Bootstrap是最著名的前端框架之一,可以帮助我们迅速创建漂亮的页面。现在它的最新版本是4.0.0-beta
,基本可以在项目中投入使用了。现在假设我们有一个启用了路由功能的基于WebPack的Vue模板项目,来看看如何安装Bootstrap 4吧。
首先,用npm安装Bootstrap 4和相关的几个依赖包。这里特别注意Bootstrap的版本,这里我们用的是4 。如果不加版本号的话,会安装3的稳定版。不过现在稳定版已经停止更新了,不会再添加任何新功能了,只进行bug修复和维护。
npm install -S [email protected] jquery popper.js
安装好之后,还需要修改WebPack配置文件。在Vue模板中,配置文件有三个,webpack.base.conf.js
、webpack.dev.conf.js
和webpack.prod.conf.js
,分别代表基础配置、开发配置和生产配置。为了让配置在所有条件下生效,我们需要在webpack.base.conf.js
中配置。办法也很简单,添加plugins
属性和下面的插件即可。如果在该文件中没有导入webpack
模块,还需要在开头添加一行const webpack = require('webpack')
导入该模块。
plugins: [
...
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery',
Popper: ['popper.js', 'default'],
})
...
]
然后在项目入口文件src/main.js
中引入Bootstrap的样式文件和JavaScript文件即可。
import Vue from 'vue'
import App from './App'
import router from './router'
// 引入Bootstrap文件
import 'bootstrap'
import 'bootstrap/dist/css/bootstrap.min.css'
Vue.config.productionTip = false
/* eslint-disable no-new */
new Vue({
...
})
最后别忘了在index.html
中添加Bootstrap的meta标签。
然后在页面中就可以使用Bootstrap样式来开发程序了。
element-ui是Vue 2.0的一组组件库,可以帮助我们快速开发项目。
首先通过npm安装。
npm i element-ui -S
然后在main.js
文件中写入以下内容。
import Vue from 'vue'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-default/index.css'
import App from './App.vue'
Vue.use(ElementUI)
new Vue({
el: '#app',
render: h => h(App)
})
element-ui的效果如图。