前言
Vue.js (读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架 ,是由华人尤雨溪独立开发的一个前端框架,也是现在前端圈最火的前端框架之一,与之并列的有Google的Angular,Facebook的React,Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合,vue提供的脚手架令你可以快速的搭建一个简单的vue单页面应用(SPA :single page web application)
源起
在讲vue之前,我们先看一下前端的前世今生,那样会更好的理解和认知vue给我们带来了什么以及为什么要使用vue
前端模块化
以前的前端代码,基本都是刀耕火种年代的jQuery或原生js手写,如下面
1 | for(var i=0; i<10; i++){ |
很明显,这样若是业务逻辑越来越多,逻辑封装成函数之后,命名越来越多,在避免命名冲突问题上就消耗很多时间,外部文件引入层叠严重,JS文件引入层层依赖
1 | <script type="text/javascript" src="a.js"></script> |
上述的js文件引入就是噩梦一般,b.js依赖a.js,c.js依赖b.js,b.js依赖a.js,书写顺序不能乱,多人协同开发很难协调,后来人们开始使用匿名自执行函数或者类似于java风格的命名空间,但是还是换汤不换药,由此,js模块化规范正式进入人们的视野,一大波前端模块化规范涌现出来,如CommonJs ,AMD/RequireJs , CMD/seajs 等等直到现在的ES6模块标准 ,而前端也因此终于开始走上台前
参考资料:
说完前端js再来说下前端三驾马车之一的css(马上就要谈到vue了,不急哈),前端样式一直是个老大难的问题,甚至还诞生了专门的css工程师,由此可见,css并不像人们看起来的那么简单,当项目结构变大,页面重构的时候,频繁的修改css样式,更改css样式结构;浏览器兼容css样式书写;css的低复用性等等这些种种弊端都会让你在每一个书写css的深夜,都有种想要拿刀砍人的冲动,于是我们有了新朋友:css预处理器,例如sass,lesss,tylus以及处理浏览器兼容样式的postcss
1 | // Mixin example |
虽然学习成本有点高,但是有了这些css预处理,我们可以得到:
- 函数,变量以及Mixin,复用css
- css模块化,改善项目结构
- 预编译,缓解多浏览器兼容造成的冗余
- ···
可以看到,有了css预处理器之后,可以让我们从繁杂冗余的css样式中摆脱出来,css代码结构也会更加的直观和清晰,开发时间和成本会减少到最低
前端构建
代码优化告一段落,但是这才只是刚刚开始,我们如果想要找出代码错误,想要压缩代码,想要自动检测代码修改,并且自动帮我们完成压缩检查的任务呢,接着我们有了强劲的新朋友:前端构建工具,诸如Gulp ,Grunt等,通过他们社区的插件。你可以轻易的做到上述所有
1 | module.exports = function(grunt) { |
上述的Gruntfile.js引入了uglify,jshint,watch插件,我们也因此可以做到压缩,代码检查,自动检测代码更改这三个效果,由此可见,前端构建工具极大地解放了人们的生产力(你也终于可以不用一行一行的去找你哪里代码写错了)
终于,你代码也写好了,代码也压缩了,现在需要部署打包了,你看了下,一百来个js,一百来个css,外加一千多张图片,每一个文件都会是一次请求,我估计等你家的网站资源加载完毕,你都已经出门买包烟回来了,这个时候,我们来个超级强劲的新朋友:前端打包工具,诸如webpack,yarn,rollup 等,超强劲的新朋友可以帮我们做到:
- 以模块化的方式来书写脚本,方便旧项目进行代码迁移
- 开发便捷,能替代部分 grunt/gulp 的工作,比如压缩混淆、图片转base64等
- 扩展性强,插件机制完善,特别是支持 热加载的功能
- ···
可以看到,利用前端打包工具bundle我们的项目,可以缩小文件体积,将多个文件合并成一个文件,减少http请求,对于我们的项目优化有着显著的作用
so, why vue?
其实我们用npm init一个项目,利用前端构建工具,npm install 相关的包,利用jQuery其实也是可以开发项目的,但是为什么要用vue,不同的框架会有不同的效果,利用jQuery我们可以更好的进行dom操作,而现在世界上60%的公司也都是在用jQuery,而利用vue可以帮我们做到的:
- 项目越来越大,前端工程化越来越明显,项目需要细分到细粒度的模块,vue’的组件系统,可以将一个大型的界面切分成一个一个更小的可控单元
- 可变的命令式操作,vue让DOM的更新操作是自动的,状态变化的时候DOM可以自动更新到正确的状态
- 做单页应用,需要有一个URL对应到一个应用的状态,vue路由vue-router可以提供路由解决方案
- 规模的状态管理,当应用变得很大,多人协作就会涉及多个组件之间的共享、多个组件需要去改动同一份状态,vue状态管理库vuex可以帮助这样大规模应用进行状态管理,让其依然能够高效运行
- vue脚手架提供的完整的项目结构,内置了webpack配置,你也可以根据自定义的从npm安装相应的依赖,诸如axios,sass,postcss等
技术选型并不容易,选择适合项目的框架可以事半功倍,时代发展越来越来,业务需求越来越复杂,前端的需求也急速提高,利用前端框架诸如vue,react提供的一套完善的全家桶配合前端构建工具可以使我们变得更简单
vue实践
以前在公司都是用的jQuery,自己学习vue也只是通过业余自学,包括前端构建工具,css预处理器等等,所以做的项目不是很多,也算不上什么经验,来了胜因很幸运,刚到就是一个前端vue实现的单页面放在眼前,要求用jQuery实现,期间只是纯粹的剥离数据和样式,没有对vue进行深入的学习,但是熟悉了vue项目的一些基本结构
1 | . |
然后开始进行早晚班后台开发,第一次接触这么中型的vue单页面项目,从一开始的不知道如何下手到后来的慢慢熟悉和上手,期间对于vue学习收获了很多,也了解了配合vue一起使用的element-ui组件库,提供了很多诸如table,input,notification等组件
vue用法
你可以在页面上直接<script>
引入vue文件
1 | <script src="https://unpkg.com/vue"></script> |
你也可以直接用vue命令行工具(前提是你熟悉node)
1 | # 安装npm |
vue主要语法包括:
- 声明式渲染:双括号进行动态绑定
- 指令:v-bind,v-for,v-if等,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM
- 组件:组件可以扩展 HTML 元素,封装可重用的代码
- vue生命周期:从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程
Vue 实例
在文档中经常会使用 vm 这个变量名表示 Vue 实例,在实例化 Vue 时,需要传入一个选项对象,它可以包含数据(data)、模板(template)、挂载元素(el)、方法(methods)、生命周期钩子(lifecyclehook)等选项
1 | var vm = new Vue({ |
vue生命周期
对于vue生命周期的了解,是你开发vue项目的必经之路,你必须很清晰的知道每一个流程,你的每一个操作,dom会发生什么变化
beforecreate : 可以在这加个loading事件,在加载实例时触发
created : 初始化完成时的事件写在这里,异步请求也适宜在这里调用
mounted : 挂载元素,获取到DOM节点
updated : 如果对数据统一处理,在这里写上相应函数
beforeDestroy : 可以做一个确认停止事件的确认框
nextTick : 更新数据后立即操作dom
更多内容参考=》vue官方文档: https://cn.vuejs.org
vue-router
vue-router是vue的官方路由,若是你想开发一个单页面vue应用,那么这将会是你最好的选择,上手也极其简单
你可以直接在页面里面引入(vue作为大哥肯定是不能少的)
1 | <script src="/path/to/vue.js"></script> |
你也可以在npm安装vue-router到项目依赖
1 | # 安装 vue-router |
来一个example看下基本的用法:
html部分
1 | <script src="https://unpkg.com/vue/dist/vue.js"></script> |
js部分
1 | // 0. 如果使用模块化机制编程,導入Vue和VueRouter,要调用 Vue.use(VueRouter) |
套用的vue-router官方的例子,关于vue-router主要的部分无非是:
<router-link>
:支持用户在具有路由功能的应用中(点击)导航。 通过to
属性指定目标地址,默认渲染成带有正确链接的<a>
标签,可以通过配置tag
属性生成别的标签.。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名<router-view>
:渲染路径匹配到的视图组件。<router-view>
渲染的组件还可以内嵌自己的<router-view>
,根据嵌套路径,渲染嵌套组件路由信息对象:表示当前激活的路由的状态信息,包含了当前 URL 解析得到的信息,还有 URL 匹配到的 route records(路由记录),属性包括:
3.1 $route.path: 对应当前路由的路径,总是解析为绝对路径,
3.2 $route.params: key/value 对象,包含了 动态片段 和 全匹配片段
3.3 $route.query: key/value 对象,表示 URL 查询参数
3.4 $route.hash: 当前路由的 hash 值 (带
#
)Router 构造配置: 属性有routes,mode,base等
更多请查阅=》vue-router官方文档: https://router.vuejs.org/zh-cn/
vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,借鉴了flux,redux等架构思想,对大中型vue项目各个组件间的状态进行管理
你可以直接在页面引入(仍然要先引入vue)
1 | <script src="/path/to/vue.js"></script> |
仍然,你也可以选择方便的安装依赖到package.json
1 | # 安装依赖到项目中 |
vuex代码一撇
1 | const store = new Vuex.Store({ |
vuex主要包括:
store:每一个 Vuex 应用的核心就是 store(仓库),创建一个 store
store = new Vuex.Store({})
state:state就是Store中包含应用中的状态,获取状态
store.state.count
mutations:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,类似于事件,
store.commit("increment")
actions: action 提交的是 mutation,而不是直接变更状态
modules: 可以将store切割成模块也就是module,可以帮助我们更好的分离各个组件间的状态
更多请查阅=》vuex官方文档: https://vuex.vuejs.org/zh-cn/installation.html
element-ui
element-ui是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,使用与vue2.0项目开发,提供了很多有用的组件
页面直接引入
1 | <!-- 引入样式 --> |
npm安装
1 | npm i element-ui -S |
如果是通过npm 安装需要注意了,你需要在main.js中引入Element
1 | 引入 |
但是还没完,样式文件还没有引入,你需要单独的引入组件的样式文件
1 | npm 安装 babel-plugin-component |
然后现在你可以根据官方文档选择你想要的组件进行开发了,若是想单独引入单个组件也是可以的
1 | 引入button select组件 |
组件太多,API写的很详细
随意的举个例子
1 | <!--> |
更多请查阅=》element-ui官方文档:http://element.eleme.io/#/zh-CN